gors 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/gors.rb +194 -0
  2. metadata +96 -0
@@ -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: