fenix-core 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +1 -0
- data.tar.gz.sig +2 -0
- data/Rakefile +11 -0
- data/fenix-core.gemspec +33 -0
- data/lib/fenix/core.rb +89 -0
- data/lib/fenix/core/application.rb +209 -0
- data/lib/fenix/core/exceptions.rb +7 -0
- data/lib/fenix/core/rendering.rb +4 -0
- data/lib/fenix/core/request.rb +18 -0
- data/lib/fenix/core/response.rb +28 -0
- data/lib/fenix/core/settings.rb +46 -0
- data/lib/fenix/core/version.rb +9 -0
- metadata +147 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 37db55f893c24efef37be505436257dd1a09dd19
|
4
|
+
data.tar.gz: c087e6e935faa04cf9ccd80f17b3cd51e0adc5f2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8e05e4febe2f6f5b4a7f45bcbddc802974ef9a455bba729f48b2cd828218a1fc9bb7d639f8d885423f1a4e28cf816dbabc8f337379f0ae623e1a349e5e6cdc02
|
7
|
+
data.tar.gz: efbf2a730fe2fb49f723f62ac8c9e7af82f4532d2b368bb1090fab18ca3fa07064e4b1baabb045c38c36ff74898952f34d3dfbda3021697c162f6be1493da3e5
|
checksums.yaml.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ep��\X� �27�z��
|
data.tar.gz.sig
ADDED
data/Rakefile
ADDED
data/fenix-core.gemspec
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'lib/fenix/core/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'fenix-core'
|
5
|
+
spec.version = Fenix.version
|
6
|
+
spec.authors = ['Benjamin Bloch']
|
7
|
+
spec.email = ['cirex@aethernet.org']
|
8
|
+
spec.homepage = 'https://github.com/fenix-novus/fenix'
|
9
|
+
spec.license = 'MIT'
|
10
|
+
spec.description = 'Lightweight web framework inspired by Sinatra'
|
11
|
+
spec.summary = spec.description
|
12
|
+
|
13
|
+
spec.files = `git ls-files`.split($/)
|
14
|
+
spec.executables = spec.files.grep(%r(/bin/)) { |file| File.basename(file) }
|
15
|
+
spec.test_files = spec.files.grep(%r(/spec/))
|
16
|
+
spec.require_paths = ['lib']
|
17
|
+
|
18
|
+
private_key = File.expand_path('~/keys/gem-private.pem')
|
19
|
+
|
20
|
+
if File.exists?(private_key)
|
21
|
+
spec.signing_key = private_key
|
22
|
+
spec.cert_chain = ['../fenix-public.pem']
|
23
|
+
end
|
24
|
+
|
25
|
+
spec.add_runtime_dependency 'rack', '~> 1.5'
|
26
|
+
spec.add_runtime_dependency 'tilt', '~> 2.0'
|
27
|
+
spec.add_runtime_dependency 'mustermann', '~> 0.2'
|
28
|
+
spec.add_runtime_dependency 'i18n', '~> 0.6'
|
29
|
+
|
30
|
+
spec.add_development_dependency 'rspec', '= 3.0.0.beta1'
|
31
|
+
|
32
|
+
spec.required_ruby_version = '>= 2.1.0'
|
33
|
+
end
|
data/lib/fenix/core.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require_relative 'core/application'
|
2
|
+
require_relative 'core/version'
|
3
|
+
|
4
|
+
require 'mustermann'
|
5
|
+
require 'rack'
|
6
|
+
require 'tilt'
|
7
|
+
|
8
|
+
RACK_ENV = ENV['RACK_ENV'] ||= 'development' unless defined?(RACK_ENV)
|
9
|
+
|
10
|
+
module Fenix
|
11
|
+
class << self
|
12
|
+
####
|
13
|
+
# @example
|
14
|
+
# Fenix.root('Application', 'Views')
|
15
|
+
# # => '/Home/Fenix/Application/Views'
|
16
|
+
#
|
17
|
+
# Fenix.root
|
18
|
+
# # => '/Home/Fenix'
|
19
|
+
#
|
20
|
+
# @return [String]
|
21
|
+
# @since 1.0.0
|
22
|
+
# @api public
|
23
|
+
def root(*paths)
|
24
|
+
File.join(FENIX_ROOT, *paths)
|
25
|
+
end
|
26
|
+
|
27
|
+
####
|
28
|
+
# Returns the current environmental state
|
29
|
+
####
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# Fenix.environment
|
33
|
+
# # => :production
|
34
|
+
#
|
35
|
+
# Fenix.environment
|
36
|
+
# # => :test
|
37
|
+
#
|
38
|
+
# @return [Symbol]
|
39
|
+
# @since 1.0.0
|
40
|
+
# @api public
|
41
|
+
def environment
|
42
|
+
@_environment ||= RACK_ENV.to_sym.downcase
|
43
|
+
end
|
44
|
+
alias_method :env, :environment
|
45
|
+
|
46
|
+
####
|
47
|
+
# @example
|
48
|
+
# Fenix.before_load do
|
49
|
+
# # ...
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# @return [Array<Proc>]
|
53
|
+
# @since 1.0.0
|
54
|
+
# @api public
|
55
|
+
def before_load(&block)
|
56
|
+
@_before_load ||= []
|
57
|
+
@_before_load << block if block_given?
|
58
|
+
@_before_load
|
59
|
+
end
|
60
|
+
|
61
|
+
####
|
62
|
+
# @example
|
63
|
+
# Fenix.after_load do
|
64
|
+
# # ...
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# @return [Array<Proc>]
|
68
|
+
# @since 1.0.0
|
69
|
+
# @api public
|
70
|
+
def after_load(&block)
|
71
|
+
@_after_load ||= []
|
72
|
+
@_after_load << block if block_given?
|
73
|
+
@_after_load
|
74
|
+
end
|
75
|
+
|
76
|
+
####
|
77
|
+
# @example
|
78
|
+
# Fenix.load_paths << Dir[Fenix.root('app', 'controllers', '**')]
|
79
|
+
#
|
80
|
+
# @return [Array<String>]
|
81
|
+
# @since 1.0.0
|
82
|
+
# @api public
|
83
|
+
def load_paths
|
84
|
+
@_load_paths ||= ['app/controllers/**', 'app/models/**', 'lib/**'].map do |directory|
|
85
|
+
Dir[Fenix.root(directory)]
|
86
|
+
end.flatten
|
87
|
+
end
|
88
|
+
end # self
|
89
|
+
end # Fenix
|
@@ -0,0 +1,209 @@
|
|
1
|
+
require_relative 'exceptions'
|
2
|
+
require_relative 'rendering'
|
3
|
+
require_relative 'settings'
|
4
|
+
require_relative 'response'
|
5
|
+
require_relative 'request'
|
6
|
+
|
7
|
+
module Fenix
|
8
|
+
class Application
|
9
|
+
attr_reader :env
|
10
|
+
attr_reader :request
|
11
|
+
attr_reader :response
|
12
|
+
|
13
|
+
include Rendering
|
14
|
+
|
15
|
+
class << self
|
16
|
+
# @private
|
17
|
+
def new(*arguments, &block)
|
18
|
+
instance = super(*arguments, &block)
|
19
|
+
stack.run(instance)
|
20
|
+
stack
|
21
|
+
end
|
22
|
+
|
23
|
+
%w(GET HEAD POST PUT PATCH DELETE OPTIONS).each do |verb|
|
24
|
+
define_method(verb.downcase) do |path, **conditions, &block|
|
25
|
+
routes[verb] << compile_route(path, conditions, &block)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @private
|
30
|
+
private def compile_route(path, conditions, &block)
|
31
|
+
{
|
32
|
+
conditions: conditions,
|
33
|
+
object: Mustermann.new(path),
|
34
|
+
block: block
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
####
|
39
|
+
# @return [Hash]
|
40
|
+
# @since 1.0.0
|
41
|
+
# @api public
|
42
|
+
def routes
|
43
|
+
@_routes ||= Hash.new { |hash, key| hash[key] = [] }
|
44
|
+
end
|
45
|
+
|
46
|
+
####
|
47
|
+
# @return [Rack::Builder]
|
48
|
+
# @see https://github.com/rack/rack/blob/master/lib/rack/builder.rb
|
49
|
+
# @since 1.0.0
|
50
|
+
# @api public
|
51
|
+
def stack
|
52
|
+
@_stack ||= Rack::Builder.new
|
53
|
+
end
|
54
|
+
|
55
|
+
####
|
56
|
+
# @param [options] Array<Symbol>
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
# enable :cache
|
60
|
+
#
|
61
|
+
# @since 1.0.0
|
62
|
+
# @api public
|
63
|
+
def enable(*options)
|
64
|
+
options.each { |option| settings[option] = true }
|
65
|
+
end
|
66
|
+
|
67
|
+
####
|
68
|
+
# @param [options] Array<Symbol>
|
69
|
+
#
|
70
|
+
# @example
|
71
|
+
# disable :cache
|
72
|
+
#
|
73
|
+
# @since 1.0.0
|
74
|
+
# @api public
|
75
|
+
def disable(*options)
|
76
|
+
options.each { |option| settings[option] = false }
|
77
|
+
end
|
78
|
+
|
79
|
+
####
|
80
|
+
# @return [Array]
|
81
|
+
# @since 1.0.0
|
82
|
+
# @api public
|
83
|
+
def extensions
|
84
|
+
@_extensions ||= []
|
85
|
+
end
|
86
|
+
|
87
|
+
###
|
88
|
+
# @param [extensions] Array
|
89
|
+
#
|
90
|
+
# @example
|
91
|
+
# register Fenix::Assets
|
92
|
+
# register Fenix::Cookies
|
93
|
+
#
|
94
|
+
# @since 1.0.0
|
95
|
+
# @api public
|
96
|
+
def register(*extensions)
|
97
|
+
self.extensions += extensions
|
98
|
+
extensions.each do |extension|
|
99
|
+
extension.registered(self) if extension.respond_to?(:registered)
|
100
|
+
extend extension
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
####
|
105
|
+
# @return [Fenix::Settings]
|
106
|
+
# @see Fenix::Settings
|
107
|
+
# @since 1.0.0
|
108
|
+
# @api public
|
109
|
+
def settings
|
110
|
+
@_settings ||= Fenix::Settings.new
|
111
|
+
end
|
112
|
+
end # self
|
113
|
+
|
114
|
+
####
|
115
|
+
# @return [Fenix::Settings]
|
116
|
+
# @see Fenix::Settings
|
117
|
+
# @since 1.0.0
|
118
|
+
# @api public
|
119
|
+
def settings
|
120
|
+
self.class.settings
|
121
|
+
end
|
122
|
+
|
123
|
+
# @return [Hash]
|
124
|
+
# @since 1.0.0
|
125
|
+
# @api public
|
126
|
+
def session
|
127
|
+
env['rack.session']
|
128
|
+
end
|
129
|
+
|
130
|
+
# @return [Symbol]
|
131
|
+
# @since 1.0.0
|
132
|
+
# @api public
|
133
|
+
def locale
|
134
|
+
I18n.locale
|
135
|
+
end
|
136
|
+
|
137
|
+
# @return [Hash]
|
138
|
+
# @since 1.0.0
|
139
|
+
# @api public
|
140
|
+
def params
|
141
|
+
request.params
|
142
|
+
end
|
143
|
+
|
144
|
+
# @return [Hash]
|
145
|
+
# @since 1.0.0
|
146
|
+
# @api public
|
147
|
+
def cookies
|
148
|
+
request.cookies
|
149
|
+
end
|
150
|
+
|
151
|
+
# @since 1.0.0
|
152
|
+
# @api public
|
153
|
+
def logger
|
154
|
+
request.logger
|
155
|
+
end
|
156
|
+
|
157
|
+
# @since 1.0.0
|
158
|
+
# @api public
|
159
|
+
def redirect(uri, **notifications)
|
160
|
+
if env['HTTP_VERSION'] == 'HTTP/1.1' and env['REQUEST_METHOD'] != 'GET'
|
161
|
+
status = 303
|
162
|
+
else
|
163
|
+
status = 302
|
164
|
+
end
|
165
|
+
|
166
|
+
response['Location'] = uri
|
167
|
+
halt(status)
|
168
|
+
end
|
169
|
+
|
170
|
+
# @since 1.0.0
|
171
|
+
# @api public
|
172
|
+
def halt(status = 500)
|
173
|
+
response.status = status
|
174
|
+
throw :halt
|
175
|
+
end
|
176
|
+
|
177
|
+
# @private
|
178
|
+
def call(env)
|
179
|
+
@env = env
|
180
|
+
@request = Fenix::Request.new(env)
|
181
|
+
@response = Fenix::Response.new
|
182
|
+
|
183
|
+
dispatch
|
184
|
+
@response.finish
|
185
|
+
end
|
186
|
+
|
187
|
+
# @private
|
188
|
+
private def dispatch
|
189
|
+
catch :halt do
|
190
|
+
if route = find_route
|
191
|
+
response.write(instance_eval(&route[:block]))
|
192
|
+
else
|
193
|
+
raise Fenix::NotFound
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# @private
|
199
|
+
private def find_route
|
200
|
+
self.class.routes[request.request_method].detect do |route|
|
201
|
+
if match = route[:object].match(request.path_info)
|
202
|
+
match.names.each_with_index do |index, name|
|
203
|
+
request[name] = match.captures[index]
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end # Application
|
209
|
+
end # Fenix
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Fenix
|
2
|
+
class Request < Rack::Request
|
3
|
+
BOT_AGENTS = [
|
4
|
+
/archive.org/i,
|
5
|
+
/baiduspider/i,
|
6
|
+
/bingbot/i,
|
7
|
+
/blexbot/i
|
8
|
+
/googlebot/i,
|
9
|
+
/msnbot/i,
|
10
|
+
/yahoo/i,
|
11
|
+
/yandexbot/i
|
12
|
+
]
|
13
|
+
|
14
|
+
def bot?
|
15
|
+
BOT_AGENTS.any? { |bot_agent| user_agent =~ bot_agent }
|
16
|
+
end
|
17
|
+
end # Request
|
18
|
+
end # Fenix
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Fenix
|
2
|
+
class Response
|
3
|
+
attr_accessor :body
|
4
|
+
attr_accessor :headers
|
5
|
+
attr_accessor :status
|
6
|
+
|
7
|
+
def initialize(body: [], status: 200, headers: { 'Content-Type' => 'text/html; charset=utf-8' })
|
8
|
+
@body, @headers, @status = body, headers, status
|
9
|
+
end
|
10
|
+
|
11
|
+
def finish
|
12
|
+
headers['Content-Length'] ||= body.each.map(&:size).inject(0, &:+).to_s
|
13
|
+
[status, headers, body]
|
14
|
+
end
|
15
|
+
|
16
|
+
def write(string)
|
17
|
+
self.body << string
|
18
|
+
end
|
19
|
+
|
20
|
+
def [](key)
|
21
|
+
@headers[key]
|
22
|
+
end
|
23
|
+
|
24
|
+
def []=(key, value)
|
25
|
+
@headers[key] = value
|
26
|
+
end
|
27
|
+
end # Request
|
28
|
+
end # Fenix
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Fenix
|
2
|
+
class Settings
|
3
|
+
# @since 1.0.0
|
4
|
+
# @api public
|
5
|
+
def initialize(file = nil)
|
6
|
+
@settings = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
####
|
10
|
+
# Returns the provided configuration option
|
11
|
+
####
|
12
|
+
#
|
13
|
+
# @param [Symbol] key
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
# settings[:compress_assets]
|
17
|
+
# # => true
|
18
|
+
#
|
19
|
+
# settings.compress_assets
|
20
|
+
# # => true
|
21
|
+
#
|
22
|
+
# @since 1.0.0
|
23
|
+
# @api public
|
24
|
+
def [](key)
|
25
|
+
@settings[key.to_sym]
|
26
|
+
end
|
27
|
+
|
28
|
+
####
|
29
|
+
# Sets the provided configuration option
|
30
|
+
####
|
31
|
+
#
|
32
|
+
# @param [Symbol] key
|
33
|
+
# @param value
|
34
|
+
#
|
35
|
+
# @example
|
36
|
+
# settings[:compress_assets] = true
|
37
|
+
# settings.compress_assets = true
|
38
|
+
#
|
39
|
+
# @return [value]
|
40
|
+
# @since 1.0.0
|
41
|
+
# @api public
|
42
|
+
def []=(key, value)
|
43
|
+
@settings[key.to_sym] = value
|
44
|
+
end
|
45
|
+
end # Settings
|
46
|
+
end # Fenix
|
metadata
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fenix-core
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Benjamin Bloch
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDfDCCAmSgAwIBAgIBATANBgkqhkiG9w0BAQUFADBCMQ4wDAYDVQQDDAVjaXJl
|
14
|
+
eDEbMBkGCgmSJomT8ixkARkWC2Zlbml4LW5vdnVzMRMwEQYKCZImiZPyLGQBGRYD
|
15
|
+
Y29tMB4XDTE0MDIxMzIwMjIzM1oXDTE1MDIxMzIwMjIzM1owQjEOMAwGA1UEAwwF
|
16
|
+
Y2lyZXgxGzAZBgoJkiaJk/IsZAEZFgtmZW5peC1ub3Z1czETMBEGCgmSJomT8ixk
|
17
|
+
ARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOH7mNE94OS2
|
18
|
+
utbVYVuKj2tDYbM2+RnIufEdb4+m5vgqt1r6MRMPGwffvNN13YyVo0qZTQLOZwkj
|
19
|
+
Bqxtp9l25S5WTMpo0zskGa7MaenITqVayrQZoXFo0rfeISZn6fuwU5rnaIlV0XWr
|
20
|
+
zEiqfnMj3QFWFOgjOj/nMHREM0diuP1zHIwXNlEc/2wlPDuEtuy6mGxt9YT+1JCp
|
21
|
+
D+12oAW/UsWUJRfMUzA8V0LzM9F0QDbzf+rdqeGWAuBuC97/5v013SpJEssBmSia
|
22
|
+
Nn9ck7aTBFv3eyg/wChPAnLyRXvVzFAAi72/6Ehs9xiUCpJDHSLbrc3VMP2VJGxK
|
23
|
+
mOn0pckZOSkCAwEAAaN9MHswCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
|
24
|
+
BBYEFIhpfbQVAq5apBAD7tmXPyG6/M9GMCAGA1UdEQQZMBeBFWNpcmV4QGZlbml4
|
25
|
+
LW5vdnVzLmNvbTAgBgNVHRIEGTAXgRVjaXJleEBmZW5peC1ub3Z1cy5jb20wDQYJ
|
26
|
+
KoZIhvcNAQEFBQADggEBABFBohle+WV4bm8+Zb1vEtyzEf2rVrgceEEXgp2kLBk8
|
27
|
+
HQj/T/7nwqUJbESPbMuk4jFg4ZVQTB7Ui7sUmVbysGMFEHrMM5ujoiTpIjJHyOxe
|
28
|
+
3ariA+qErQyJAjZcY2FvDI65jOYK/kWEHhPMrqHDIGUQMK4zTz7rHsT4E0hxdftB
|
29
|
+
7RlEdgZQ/0TVeZchImNepXrLOtYMXL8tjTFhqnuVTWW00gKoRrEiuXw0igtw2cG+
|
30
|
+
szIvSaoMHw6qsq2Dsa0StAFlPE59s5HlRmyKR0BZ83ulvk7nLve08La5fGA6AKkJ
|
31
|
+
RURvnKXD6fC98LPWN6uJtIHFLf4Ss9Q3YLmEkegO2WM=
|
32
|
+
-----END CERTIFICATE-----
|
33
|
+
date: 2014-02-13 00:00:00.000000000 Z
|
34
|
+
dependencies:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rack
|
37
|
+
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.5'
|
42
|
+
type: :runtime
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.5'
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: tilt
|
51
|
+
requirement: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '2.0'
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '2.0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: mustermann
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0.2'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0.2'
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: i18n
|
79
|
+
requirement: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0.6'
|
84
|
+
type: :runtime
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0.6'
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: rspec
|
93
|
+
requirement: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 3.0.0.beta1
|
98
|
+
type: :development
|
99
|
+
prerelease: false
|
100
|
+
version_requirements: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 3.0.0.beta1
|
105
|
+
description: Lightweight web framework inspired by Sinatra
|
106
|
+
email:
|
107
|
+
- cirex@aethernet.org
|
108
|
+
executables: []
|
109
|
+
extensions: []
|
110
|
+
extra_rdoc_files: []
|
111
|
+
files:
|
112
|
+
- Rakefile
|
113
|
+
- fenix-core.gemspec
|
114
|
+
- lib/fenix/core.rb
|
115
|
+
- lib/fenix/core/application.rb
|
116
|
+
- lib/fenix/core/exceptions.rb
|
117
|
+
- lib/fenix/core/rendering.rb
|
118
|
+
- lib/fenix/core/request.rb
|
119
|
+
- lib/fenix/core/response.rb
|
120
|
+
- lib/fenix/core/settings.rb
|
121
|
+
- lib/fenix/core/version.rb
|
122
|
+
homepage: https://github.com/fenix-novus/fenix
|
123
|
+
licenses:
|
124
|
+
- MIT
|
125
|
+
metadata: {}
|
126
|
+
post_install_message:
|
127
|
+
rdoc_options: []
|
128
|
+
require_paths:
|
129
|
+
- lib
|
130
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: 2.1.0
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
requirements: []
|
141
|
+
rubyforge_project:
|
142
|
+
rubygems_version: 2.2.1
|
143
|
+
signing_key:
|
144
|
+
specification_version: 4
|
145
|
+
summary: Lightweight web framework inspired by Sinatra
|
146
|
+
test_files: []
|
147
|
+
has_rdoc:
|
metadata.gz.sig
ADDED
Binary file
|