spire 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/Gemfile.lock +2 -0
- data/README.rdoc +26 -25
- data/VERSION +1 -1
- data/lib/spire/error.rb +33 -2
- data/lib/spire/router.rb +29 -24
- data/spire.gemspec +5 -2
- metadata +26 -15
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -6,7 +6,7 @@ Light controller-only rack framework with a dash of views.
|
|
6
6
|
|
7
7
|
gem install spire
|
8
8
|
spire -c project_name
|
9
|
-
cd
|
9
|
+
cd !$ && rackup
|
10
10
|
|
11
11
|
This will install spire, create a project called 'project_name' in the same directory it's run in, and then start the site.
|
12
12
|
|
@@ -29,46 +29,47 @@ That would when '/foo/bar' is requested return the response found in the FooCont
|
|
29
29
|
|
30
30
|
Controllers are named to tie with the routes (read above). They are stored in:
|
31
31
|
project_name/app/controllers/
|
32
|
-
|
33
|
-
|
32
|
+
With the naming scheme like so:
|
33
|
+
FooController.rb
|
34
|
+
Where Foo is the name of the controller. The name must be camel-cased. All classes must be defined like so:
|
35
|
+
class Foo < Spire::MainController
|
34
36
|
|
35
37
|
end
|
36
38
|
as a skeleton controller for the framework to use. An example response would look like this:
|
37
39
|
class Index < Spire::MainController
|
38
40
|
def index
|
39
|
-
|
41
|
+
"This is just a response"
|
40
42
|
end
|
41
43
|
end
|
42
44
|
This would display a html page with that text. The Response.new initiator could be used like so:
|
43
|
-
|
44
|
-
|
45
|
+
def index
|
46
|
+
@status = 200
|
47
|
+
@content_type = "text/html;"
|
48
|
+
return "Hi, I'm a test page!"
|
49
|
+
end
|
50
|
+
Where the first instance variable @status is the HTTP status to show, the second being the content type, and the last being the returned value as a string.
|
45
51
|
|
46
52
|
== Views
|
47
53
|
|
54
|
+
=== RHTML
|
55
|
+
RHTML templates are executed using erubis due to its speed. To create a erb view, you must create a view in:
|
56
|
+
/app/views/
|
57
|
+
With the naming scheme of:
|
58
|
+
template.rhtml
|
59
|
+
The .rhtml is important so Spire knows what file it is. To pass data to a view, you simply define an instance variable before you render the template and it will automatically be accessible in your view template.
|
60
|
+
To render a template, you simply use:
|
61
|
+
render("index.rhtml")
|
62
|
+
|
48
63
|
=== HAML
|
49
64
|
HAML templates can be rendered like so:
|
50
|
-
|
51
|
-
"This is a base app to extend your own on. Have fun!"]))
|
65
|
+
render("index.haml")
|
52
66
|
This would load the index.haml view in:
|
53
|
-
|
54
|
-
|
55
|
-
To access the data in the view, you have to use the 'data' variable like so:
|
56
|
-
%title= data[0]
|
57
|
-
%h1= data[1]
|
58
|
-
This above example would use the first array entry from our render method as a title, and the second array entry for a nice big header.
|
67
|
+
/app/views/index.haml
|
68
|
+
To pass data to the view, define and fill an instance variable with content or an object, and you can use it inside your HAML view.
|
59
69
|
|
60
70
|
=== HTML
|
61
71
|
HTML are static templates to be used in your project/app, they can't use variables, nor can they execute ruby code. They can be rendered using:
|
62
|
-
|
72
|
+
render("index.html")
|
63
73
|
Which would load the 'index.html' file from:
|
64
74
|
project_name/app/views/index.html
|
65
|
-
The first argument is the file name, the second being the extension.
|
66
|
-
|
67
|
-
= Coming soon...
|
68
|
-
More documentation will be coming soon as more features are being added
|
69
|
-
=== Error Handler
|
70
|
-
=== SASS Support
|
71
|
-
=== Improved Response handler
|
72
|
-
=== Lots of bugfixes
|
73
|
-
=== Some secret goodes!
|
74
|
-
|
75
|
+
The first argument is the file name, the second being the extension.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
data/lib/spire/error.rb
CHANGED
@@ -1,11 +1,42 @@
|
|
1
1
|
module Spire
|
2
2
|
class Error
|
3
3
|
def initialize(message, status='200')
|
4
|
-
|
4
|
+
case status
|
5
|
+
when 200
|
6
|
+
self.return_error(message, status)
|
7
|
+
when 404
|
8
|
+
self.return_404
|
9
|
+
when 401
|
10
|
+
self.return_401
|
11
|
+
when 204
|
12
|
+
self.return_204
|
13
|
+
when 301
|
14
|
+
self.return_301
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def return_404
|
19
|
+
@return = Response.new("404 // Page not found", 'text/html;', 404)
|
20
|
+
end
|
21
|
+
|
22
|
+
def return_401
|
23
|
+
@return = Response.new("401 // Not authorized", 'text/html;', 401)
|
24
|
+
end
|
25
|
+
|
26
|
+
def return_204
|
27
|
+
@return = Response.new("204 // No content", 'text/html;', 204)
|
28
|
+
end
|
29
|
+
|
30
|
+
def return_301
|
31
|
+
@return = Response.new("301 // Moved permanently", 'text/html;', 301)
|
32
|
+
end
|
33
|
+
|
34
|
+
def return_error(message, status)
|
35
|
+
@return = Response.new(message, 'text/html;', status)
|
5
36
|
end
|
6
37
|
|
7
38
|
def to_rack
|
8
39
|
@return.to_rack
|
9
40
|
end
|
10
41
|
end
|
11
|
-
end
|
42
|
+
end
|
data/lib/spire/router.rb
CHANGED
@@ -3,59 +3,64 @@ module Spire
|
|
3
3
|
def initialize(base_path, routes)
|
4
4
|
@base_path = base_path
|
5
5
|
@routes = routes
|
6
|
+
@app = {}
|
6
7
|
end
|
7
8
|
|
8
9
|
def disect(env)
|
9
10
|
req = env['REQUEST_PATH'].split("/")
|
10
|
-
@request = {"controller" => req[1], "action" => req[2]}
|
11
|
+
@request = {"controller" => req[1], "action" => req[2]}
|
11
12
|
end
|
12
13
|
|
13
14
|
def route
|
14
|
-
@
|
15
|
-
|
16
|
-
if @request["controller"] == "favicon.ico"
|
17
|
-
return Response.new(File.open("public/favicon.ico", 'r').read, "image/ico;")
|
15
|
+
if @request["controller"] == "public"
|
16
|
+
self.return_file
|
18
17
|
end
|
18
|
+
|
19
19
|
if @request["controller"] == nil
|
20
20
|
route = @routes['default'].split("#")
|
21
|
-
@
|
22
|
-
@
|
21
|
+
@app["controller"] = route[0].capitalize
|
22
|
+
@app["action"] = route[1]
|
23
23
|
else
|
24
24
|
@routes.each do |key, value|
|
25
25
|
keys = key.split("/")
|
26
26
|
values = value.split("#")
|
27
27
|
if @request["controller"] == keys[1] && @request["action"] == keys[3]
|
28
|
-
|
29
|
-
@
|
30
|
-
puts @controller_value
|
31
|
-
@action_value = values[1]
|
28
|
+
@app["controller"] = values[0].capitalize
|
29
|
+
@app["action"] = values[1]
|
32
30
|
elsif @request["controller"] == keys[1]
|
33
|
-
|
34
|
-
@
|
35
|
-
puts @controller_value
|
36
|
-
@action_value = values[1]
|
31
|
+
@app["controller"] = values[0].capitalize
|
32
|
+
@app["action"] = values[1]
|
37
33
|
end
|
38
34
|
end
|
39
35
|
end
|
40
|
-
|
41
|
-
|
36
|
+
|
37
|
+
unless @app["controller"]
|
38
|
+
return Error.new(nil ,404)
|
42
39
|
end
|
40
|
+
|
43
41
|
return self.run
|
44
42
|
end
|
45
43
|
|
44
|
+
def return_file
|
45
|
+
# still need to add checks for mime types. this will be done in a seperate class once i get round to it
|
46
|
+
return Response.new(File.open("/public/#{@request["action"]}", "r").read)
|
47
|
+
end
|
48
|
+
|
46
49
|
def run
|
47
|
-
require "#{@base_path}/controllers/#{@
|
48
|
-
@
|
50
|
+
require "#{@base_path}/controllers/#{@app["controller"]}Controller"
|
51
|
+
@class = Kernel.const_get(@app["controller"]).new(@base_path)
|
49
52
|
|
50
|
-
result = @
|
53
|
+
result = @class.method(@app["action"]).call
|
54
|
+
|
51
55
|
content_type = "text/html;"
|
52
56
|
status = 200
|
53
57
|
|
54
|
-
if @
|
55
|
-
status = @
|
58
|
+
if @class.instance_variable_get(:@status)
|
59
|
+
status = @class.instance_variable_get(:@status)
|
56
60
|
end
|
57
|
-
|
58
|
-
|
61
|
+
|
62
|
+
if @class.instance_variable_get(:@content_type)
|
63
|
+
content_type = @class.instance_variable_get(:content_type)
|
59
64
|
end
|
60
65
|
|
61
66
|
return Response.new(result, content_type, status)
|
data/spire.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "spire"
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Scott Nicol"]
|
12
|
-
s.date = "2011-10-
|
12
|
+
s.date = "2011-10-07"
|
13
13
|
s.description = "Light rack-based framework with controllers, static views and a router \n with templating engine support coming soon"
|
14
14
|
s.email = "scott@scottnicol.co.uk"
|
15
15
|
s.executables = ["spire"]
|
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
|
42
42
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
43
43
|
s.add_runtime_dependency(%q<rack>, [">= 1.3.0"])
|
44
|
+
s.add_runtime_dependency(%q<rack-rewrite>, [">= 1.2.1"])
|
44
45
|
s.add_runtime_dependency(%q<haml>, [">= 3.1.0"])
|
45
46
|
s.add_runtime_dependency(%q<erubis>, [">= 2.7.0"])
|
46
47
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -48,6 +49,7 @@ Gem::Specification.new do |s|
|
|
48
49
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
49
50
|
else
|
50
51
|
s.add_dependency(%q<rack>, [">= 1.3.0"])
|
52
|
+
s.add_dependency(%q<rack-rewrite>, [">= 1.2.1"])
|
51
53
|
s.add_dependency(%q<haml>, [">= 3.1.0"])
|
52
54
|
s.add_dependency(%q<erubis>, [">= 2.7.0"])
|
53
55
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -56,6 +58,7 @@ Gem::Specification.new do |s|
|
|
56
58
|
end
|
57
59
|
else
|
58
60
|
s.add_dependency(%q<rack>, [">= 1.3.0"])
|
61
|
+
s.add_dependency(%q<rack-rewrite>, [">= 1.2.1"])
|
59
62
|
s.add_dependency(%q<haml>, [">= 3.1.0"])
|
60
63
|
s.add_dependency(%q<erubis>, [">= 2.7.0"])
|
61
64
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-10-
|
12
|
+
date: 2011-10-07 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
16
|
-
requirement: &
|
16
|
+
requirement: &70227958728580 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,21 @@ dependencies:
|
|
21
21
|
version: 1.3.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70227958728580
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rack-rewrite
|
27
|
+
requirement: &70227958723620 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.2.1
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70227958723620
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: haml
|
27
|
-
requirement: &
|
38
|
+
requirement: &70227958712040 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ! '>='
|
@@ -32,10 +43,10 @@ dependencies:
|
|
32
43
|
version: 3.1.0
|
33
44
|
type: :runtime
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70227958712040
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: erubis
|
38
|
-
requirement: &
|
49
|
+
requirement: &70227958709100 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ! '>='
|
@@ -43,10 +54,10 @@ dependencies:
|
|
43
54
|
version: 2.7.0
|
44
55
|
type: :runtime
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70227958709100
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: bundler
|
49
|
-
requirement: &
|
60
|
+
requirement: &70227958707440 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ~>
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: 1.0.0
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70227958707440
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: jeweler
|
60
|
-
requirement: &
|
71
|
+
requirement: &70227958705300 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ~>
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: 1.6.4
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70227958705300
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: rcov
|
71
|
-
requirement: &
|
82
|
+
requirement: &70227958703260 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ! '>='
|
@@ -76,7 +87,7 @@ dependencies:
|
|
76
87
|
version: '0'
|
77
88
|
type: :development
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *70227958703260
|
80
91
|
description: ! "Light rack-based framework with controllers, static views and a router
|
81
92
|
\n with templating engine support coming soon"
|
82
93
|
email: scott@scottnicol.co.uk
|
@@ -113,7 +124,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
113
124
|
version: '0'
|
114
125
|
segments:
|
115
126
|
- 0
|
116
|
-
hash:
|
127
|
+
hash: -337069759895717094
|
117
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
129
|
none: false
|
119
130
|
requirements:
|