gors 0.0.1
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.
- data/lib/gors.rb +194 -0
- metadata +96 -0
data/lib/gors.rb
ADDED
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'rack'
|
2
|
+
require 'erb'
|
3
|
+
require 'tilt'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Gors
|
7
|
+
class Server
|
8
|
+
def initialize
|
9
|
+
@settings = Settings.new
|
10
|
+
@logger = Logger.new(@settings)
|
11
|
+
@routesklass = Routes.new(@logger)
|
12
|
+
end
|
13
|
+
def call env
|
14
|
+
@logger.log env["REQUEST_METHOD"]+" "+env["REQUEST_PATH"]
|
15
|
+
controller = @routesklass.routes[env["PATH_INFO"]]
|
16
|
+
if(controller == nil)
|
17
|
+
if(@settings.server != "thin")
|
18
|
+
response = ["<h1>404 Not Found</h1>"]
|
19
|
+
else
|
20
|
+
response = "<h1>404 Not Found</h1>"
|
21
|
+
end
|
22
|
+
return ["404",{},response]
|
23
|
+
end
|
24
|
+
|
25
|
+
if(controller.include? "Gors::")
|
26
|
+
ctrl = controller.split("#")
|
27
|
+
params = ctrl[1].split(":")
|
28
|
+
|
29
|
+
data = Model.new.call(params[1])
|
30
|
+
return ["200",{"Content-type" => "application/json"},[data]]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Call the Controller
|
34
|
+
request = Request.new
|
35
|
+
request.request.params = Rack::Utils.parse_query(env["QUERY_STRING"])
|
36
|
+
|
37
|
+
infoctrl = controller.split("#")
|
38
|
+
ctrl = Object.const_get(infoctrl[0]).new(request)
|
39
|
+
|
40
|
+
response = ctrl.send(infoctrl[1])
|
41
|
+
if(@settings.server != "thin")
|
42
|
+
response = [response]
|
43
|
+
end
|
44
|
+
[ctrl.info.response.status_code,ctrl.info.response.headers,response]
|
45
|
+
end
|
46
|
+
|
47
|
+
def start
|
48
|
+
if(@settings.daemon)
|
49
|
+
puts "Sending Gors to background"
|
50
|
+
system("kill `cat running.pid`")
|
51
|
+
Process.daemon true
|
52
|
+
File.write("running.pid",Process.pid)
|
53
|
+
end
|
54
|
+
@logger.log @routesklass.inspect
|
55
|
+
Rack::Server.new({:app => self,:server => @settings.server, :Port => @settings.port}).start
|
56
|
+
end
|
57
|
+
|
58
|
+
def routes &block
|
59
|
+
@routesklass.instance_eval &block
|
60
|
+
end
|
61
|
+
|
62
|
+
def settings
|
63
|
+
yield(@settings)
|
64
|
+
end
|
65
|
+
|
66
|
+
def autoimport
|
67
|
+
Dir.glob("controllers/*").each do |file|
|
68
|
+
require './'+file
|
69
|
+
end
|
70
|
+
|
71
|
+
Dir.glob("models/*").each do |file|
|
72
|
+
require './'+file
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
class Routes
|
78
|
+
attr_accessor :routes
|
79
|
+
attr_accessor :models
|
80
|
+
attr_accessor :posts
|
81
|
+
|
82
|
+
def initialize logger
|
83
|
+
@routes = {}
|
84
|
+
@models = {}
|
85
|
+
@logger = logger
|
86
|
+
@routespost = {}
|
87
|
+
end
|
88
|
+
|
89
|
+
def get hash
|
90
|
+
@routes[hash.keys.first.to_s] = hash[hash.keys.first.to_s]
|
91
|
+
@logger.log "Adding route GET "+hash.keys.first.to_s
|
92
|
+
end
|
93
|
+
|
94
|
+
def post hash
|
95
|
+
@routespost[hash.keys.first.to_s] = hash[hash.keys.first.to_s]
|
96
|
+
@logger.log "Adding route POST "+hash.keys.first.to_s
|
97
|
+
end
|
98
|
+
|
99
|
+
def post
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
def model hash
|
104
|
+
@routes["/api/"+hash.keys.first.to_s] = "Gors::Model#call:"+hash[hash.keys.first.to_s];
|
105
|
+
puts "Adding model with path "+hash.keys.first.to_s
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
class Controller
|
110
|
+
attr_accessor :info
|
111
|
+
|
112
|
+
def initialize(context)
|
113
|
+
@info = context
|
114
|
+
if(self.respond_to? "before")
|
115
|
+
self.before
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def erb template
|
120
|
+
renderer = Tilt::ERBTemplate.new("views/layout.erb")
|
121
|
+
output = renderer.render(self){ Tilt::ERBTemplate.new("views/"+template+".erb").render(self) }
|
122
|
+
return output
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
class Request
|
127
|
+
attr_accessor :response
|
128
|
+
attr_accessor :request
|
129
|
+
|
130
|
+
def initialize
|
131
|
+
@response = OpenStruct.new ({:headers => {}, :status_code => "200"})
|
132
|
+
@request = OpenStruct.new ({:ip => "",:user_agent => "",:headers => {},:params => {}})
|
133
|
+
end
|
134
|
+
|
135
|
+
def info
|
136
|
+
return @info
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
class Model
|
141
|
+
def call modelname
|
142
|
+
if(Object.const_get(modelname.capitalize).respond_to? "append")
|
143
|
+
puts "Running appending function"
|
144
|
+
model = Object.const_get(modelname.capitalize).all.send(Object.const_get(modelname.capitalize).append)
|
145
|
+
else
|
146
|
+
model = Object.const_get(modelname.capitalize).all
|
147
|
+
end
|
148
|
+
model.to_json
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
class Settings
|
153
|
+
attr_accessor :port
|
154
|
+
attr_accessor :server
|
155
|
+
attr_accessor :verbose
|
156
|
+
attr_accessor :daemon
|
157
|
+
|
158
|
+
def initialize
|
159
|
+
@port = 8080
|
160
|
+
@server = "thin"
|
161
|
+
@verbose = true
|
162
|
+
@daemon = false
|
163
|
+
end
|
164
|
+
end
|
165
|
+
class Logger
|
166
|
+
|
167
|
+
def initialize(settings)
|
168
|
+
@settings = settings
|
169
|
+
end
|
170
|
+
|
171
|
+
def log msg
|
172
|
+
if(@settings.daemon)
|
173
|
+
return
|
174
|
+
end
|
175
|
+
if(@settings.verbose)
|
176
|
+
puts msg
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
class DataManager
|
183
|
+
def self.model modelname
|
184
|
+
Object.const_get(modelname)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
at_exit do
|
190
|
+
puts "Exiting..."
|
191
|
+
if(File.exists? "running.pid")
|
192
|
+
File.delete("running.pid")
|
193
|
+
end
|
194
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gors
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Bram Vandenbogaerde
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: tilt
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: json
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rack
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: A web framework built on top of Rack, it has the simplicity of sinatra
|
63
|
+
and the structure of rails
|
64
|
+
email: bram.vandenbogaerde@gmail.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- lib/gors.rb
|
70
|
+
homepage: http://rubygems.org/gems/gors
|
71
|
+
licenses:
|
72
|
+
- MIT
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options: []
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 1.8.23
|
92
|
+
signing_key:
|
93
|
+
specification_version: 3
|
94
|
+
summary: Great Opensource Rack Server
|
95
|
+
test_files: []
|
96
|
+
has_rdoc:
|