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.
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: