odex 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.
- checksums.yaml +7 -0
- data/Gemfile +7 -0
- data/README.md +34 -0
- data/Rakefile +1 -0
- data/lib/odex/app.rb +245 -0
- data/lib/odex/modules/templates.rb +22 -0
- data/lib/odex/version.rb +3 -0
- data/lib/odex.rb +19 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1c7c61c0f5000ec3c865c9a1c08de459df7f7ae2
|
4
|
+
data.tar.gz: a0e3d37c71ed16f5939f4ef2a4d0d61fe79b24b1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 379ec12671a1b51038c9abe0408bcbcc2b827f2f8e19264080f6295599ab4fad2c5d4c2c1284d273acaede716c73036889fe78b6d9c0385fa99a04515c092ca3
|
7
|
+
data.tar.gz: 34d036481807d30be53abbb6891691b7c3f06f18cfbb95f9d1ed88673117c6a53ea08623d67692174f4cdb0783029b818af4c5eee395435e895aae05681d531f
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Odex.
|
2
|
+
Small web framework.
|
3
|
+
|
4
|
+
```ruby
|
5
|
+
# odex_test.rb
|
6
|
+
|
7
|
+
require 'odex'
|
8
|
+
class App < Odex::App
|
9
|
+
get '/' do
|
10
|
+
'Hello world!'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
App.go(3000)!
|
15
|
+
```
|
16
|
+
|
17
|
+
Run the file:
|
18
|
+
|
19
|
+
```bash
|
20
|
+
ruby myapp.rb
|
21
|
+
```
|
22
|
+
Install the gem:
|
23
|
+
|
24
|
+
```bash
|
25
|
+
gem install odex
|
26
|
+
```
|
27
|
+
|
28
|
+
# Contributing
|
29
|
+
|
30
|
+
1. Fork it
|
31
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
32
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
33
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
34
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/odex/app.rb
ADDED
@@ -0,0 +1,245 @@
|
|
1
|
+
module Odex
|
2
|
+
# Odex Builder
|
3
|
+
class OdexBuilder < Rack::Builder
|
4
|
+
end
|
5
|
+
|
6
|
+
# Odex Request
|
7
|
+
class OdexRequest < ActionDispatch::Journey::Routes
|
8
|
+
end
|
9
|
+
|
10
|
+
# Odex Router
|
11
|
+
class OdexRouter < ActionDispatch::Journey::Router
|
12
|
+
end
|
13
|
+
|
14
|
+
# Odex Pattern
|
15
|
+
class OdexPattern < ActionDispatch::Journey::Path::Pattern
|
16
|
+
end
|
17
|
+
|
18
|
+
# Request
|
19
|
+
|
20
|
+
class Req
|
21
|
+
extend Forwardable
|
22
|
+
|
23
|
+
attr_reader :request, :response
|
24
|
+
def_delegators :request, :session, :params
|
25
|
+
def_delegators :response, :headers
|
26
|
+
|
27
|
+
def initialize(env)
|
28
|
+
@request = Request.new(env)
|
29
|
+
@request.params.merge!(env['odex.params'])
|
30
|
+
@response = Response.new([], 200, {'Content-Type' => 'text/html'})
|
31
|
+
end
|
32
|
+
|
33
|
+
def cookies
|
34
|
+
@cookies ||= Rack::Cookies::CookieJar.new(request.cookies)
|
35
|
+
end
|
36
|
+
|
37
|
+
def status(code)
|
38
|
+
response.status = code
|
39
|
+
end
|
40
|
+
|
41
|
+
def halt(status, headers={}, body='')
|
42
|
+
@response = Response.new(body, status, headers)
|
43
|
+
cookies.finish!(response) if @cookies
|
44
|
+
throw(:halt, response)
|
45
|
+
end
|
46
|
+
|
47
|
+
def system_redirect_to(uri, status=302)
|
48
|
+
halt(status, {'Location' => uri})
|
49
|
+
end
|
50
|
+
alias_method :redirect, :system_redirect_to
|
51
|
+
|
52
|
+
def apply_to(&handler)
|
53
|
+
data = instance_eval(&handler)
|
54
|
+
data.respond_to?(:each) ? response.body = data : response.write(data)
|
55
|
+
cookies.finish!(response) if @cookies
|
56
|
+
response
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Router
|
61
|
+
|
62
|
+
class Router
|
63
|
+
attr_reader :c, :od_jr, :hook_before, :hook_after, :fallback
|
64
|
+
def initialize(options)
|
65
|
+
@c = options[:c]
|
66
|
+
@hook_before = options[:hook_before]
|
67
|
+
@hook_after = options[:hook_after]
|
68
|
+
@fallback = options[:fallback]
|
69
|
+
|
70
|
+
prepare_for_od_jr(options[:route_defs])
|
71
|
+
end
|
72
|
+
|
73
|
+
def call(env)
|
74
|
+
response = od_jr.call(env)
|
75
|
+
|
76
|
+
if response[0] == 40 and
|
77
|
+
fallback.call(env)
|
78
|
+
else
|
79
|
+
response
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def prepare_for_od_jr(route_defs)
|
84
|
+
routes = Odex::OdexRequest.new
|
85
|
+
@od_jr = Odex::OdexRouter.new(routes, {
|
86
|
+
:parameters_key => 'odex.params',
|
87
|
+
:request_class => Odex::Request
|
88
|
+
})
|
89
|
+
|
90
|
+
route_defs.each do |path, options, handler|
|
91
|
+
pat = Odex::OdexPattern.new(path)
|
92
|
+
constraints = options.fetch(:constraints, {})
|
93
|
+
defaults = options.fetch(:defaults, {})
|
94
|
+
|
95
|
+
@od_jr.routes.add_route compile(handler), pat, constraints, defaults
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def compile(handler)
|
100
|
+
Proc.new do |env|
|
101
|
+
scope = c.new(env)
|
102
|
+
|
103
|
+
response = catch (:halt) do
|
104
|
+
hook_before.each {|h| scope.instance_eval &h }
|
105
|
+
scope.apply_to &handler
|
106
|
+
end
|
107
|
+
|
108
|
+
catch (:halt) do
|
109
|
+
hook_after.each {|h| scope.instance_eval &h }
|
110
|
+
end
|
111
|
+
|
112
|
+
response.finish
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Initializer
|
118
|
+
|
119
|
+
module Init
|
120
|
+
def self.included(base)
|
121
|
+
base.class_eval do
|
122
|
+
def self.init_methods name, value
|
123
|
+
@_methods ||= []
|
124
|
+
@_methods << name
|
125
|
+
self.class.send(:attr_accessor, name)
|
126
|
+
self.send("#{name}=", value)
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.inherited(subclass)
|
130
|
+
@_methods.each do |attr|
|
131
|
+
subclass.init_methods attr, self.send(attr).deep_dup
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# Rack Request
|
139
|
+
class Request < Rack::Request
|
140
|
+
def params
|
141
|
+
@params ||= ActiveSupport::HashWithIndifferentAccess.new(super)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Rack Response
|
146
|
+
|
147
|
+
class Response < Rack::Response
|
148
|
+
end
|
149
|
+
|
150
|
+
# Odex Base
|
151
|
+
|
152
|
+
class Base
|
153
|
+
include Odex::Init
|
154
|
+
METHODS = [:options, :patch, :post, :put, :trace, :delete, :get, :head]
|
155
|
+
|
156
|
+
init_methods :c, Class.new(Req)
|
157
|
+
init_methods :route_defs, []
|
158
|
+
init_methods :hook_before, []
|
159
|
+
init_methods :hook_after, []
|
160
|
+
init_methods :default_constraints, {}
|
161
|
+
init_methods :map, {}
|
162
|
+
|
163
|
+
def initialize(app=nil)
|
164
|
+
builder = odex_rack_builder
|
165
|
+
builder.run Router.new({
|
166
|
+
:c => self.class.c,
|
167
|
+
:route_defs => self.class.route_defs,
|
168
|
+
:hook_before => self.class.hook_before,
|
169
|
+
:hook_after => self.class.hook_after,
|
170
|
+
:fallback => app
|
171
|
+
})
|
172
|
+
|
173
|
+
@app = builder.to_app
|
174
|
+
end
|
175
|
+
|
176
|
+
def odex_rack_builder
|
177
|
+
rack_builder = Odex::OdexBuilder.new
|
178
|
+
self.class.map.each do |url, map_class|
|
179
|
+
rack_builder.map(url) do
|
180
|
+
use map_class
|
181
|
+
end
|
182
|
+
end
|
183
|
+
rack_builder
|
184
|
+
end
|
185
|
+
|
186
|
+
def call env
|
187
|
+
@app.call env
|
188
|
+
end
|
189
|
+
|
190
|
+
class << self
|
191
|
+
METHODS.each do |method|
|
192
|
+
define_method method do |path, options={}, &block|
|
193
|
+
options[:constraints] = options[:constraints] || {}
|
194
|
+
options[:constraints].merge!(:request_method => method.to_s.upcase)
|
195
|
+
route path, options, &block
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def group(url, app=nil, &block)
|
200
|
+
scope = self.c
|
201
|
+
|
202
|
+
app ||= Class.new(self.superclass) do
|
203
|
+
self.c = scope
|
204
|
+
class_eval(&block)
|
205
|
+
end
|
206
|
+
|
207
|
+
map[url] = app
|
208
|
+
end
|
209
|
+
|
210
|
+
def before_proc(&block)
|
211
|
+
hook_before << Proc.new(&block)
|
212
|
+
end
|
213
|
+
|
214
|
+
def after_proc(&block)
|
215
|
+
hook_after << Proc.new(&block)
|
216
|
+
end
|
217
|
+
|
218
|
+
def ext(*extensions)
|
219
|
+
extensions.each do |ext|
|
220
|
+
extend ext
|
221
|
+
ext.module_is_registered(self) if ext.respond_to?(:module_is_registered)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def helpers(*args, &block)
|
226
|
+
args << Module.new(&block) if block_given?
|
227
|
+
args.each {|m| c.send :include, m }
|
228
|
+
end
|
229
|
+
|
230
|
+
def route(path, options, &block)
|
231
|
+
self.route_defs << [path, options, Proc.new(&block)]
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
class App < Base
|
238
|
+
class << self
|
239
|
+
def go!(port = 1453)
|
240
|
+
Rack::Handler.pick(['webrick']).run new, :Port => port
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'tilt'
|
2
|
+
require 'slim'
|
3
|
+
|
4
|
+
module Odex
|
5
|
+
module Templates
|
6
|
+
module Helpers
|
7
|
+
def render template, locals = {}, options = {}, &block
|
8
|
+
template_cache.fetch(template) do
|
9
|
+
Slim::Template.new(template, options)
|
10
|
+
end.render(self, locals, &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def template_cache
|
14
|
+
Thread.current[:template_cache] ||= Tilt::Cache.new
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.module_is_registered app
|
19
|
+
app.helpers Helpers
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/odex/version.rb
ADDED
data/lib/odex.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Version
|
2
|
+
require 'odex/version'
|
3
|
+
|
4
|
+
# General
|
5
|
+
require 'rack'
|
6
|
+
require 'active_support/hash_with_indifferent_access'
|
7
|
+
require 'active_support/core_ext/object/deep_dup'
|
8
|
+
require 'forwardable'
|
9
|
+
require 'rack/contrib/cookies'
|
10
|
+
require 'active_support/concern'
|
11
|
+
require 'action_dispatch/routing'
|
12
|
+
require 'action_dispatch/journey'
|
13
|
+
require 'pathname'
|
14
|
+
|
15
|
+
# Modules
|
16
|
+
require 'odex/modules/templates'
|
17
|
+
|
18
|
+
# Application
|
19
|
+
require 'odex/app'
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: odex
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sedat ÇİFTÇİ
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.14.1
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.14.1
|
41
|
+
description: Small web framework.
|
42
|
+
email:
|
43
|
+
- me@sedat.us
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- README.md
|
49
|
+
- Gemfile
|
50
|
+
- Rakefile
|
51
|
+
- lib/odex/app.rb
|
52
|
+
- lib/odex/modules/templates.rb
|
53
|
+
- lib/odex/version.rb
|
54
|
+
- lib/odex.rb
|
55
|
+
homepage: http://odex.sedat.us
|
56
|
+
licenses:
|
57
|
+
- MIT
|
58
|
+
metadata: {}
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 2.0.14
|
76
|
+
signing_key:
|
77
|
+
specification_version: 4
|
78
|
+
summary: Odex
|
79
|
+
test_files: []
|