genki 0.1.0.beta1 → 0.1.0.beta2
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 +4 -4
- data/.rspec +1 -0
- data/.rubocop.yml +6 -1
- data/.travis.yml +4 -0
- data/README.md +34 -14
- data/genki.gemspec +4 -3
- data/lib/genki.rb +11 -1
- data/lib/genki/cli.rb +15 -0
- data/lib/genki/errors/route_already_defined_error.rb +12 -0
- data/lib/genki/errors/route_not_found_error.rb +9 -0
- data/lib/genki/generators/app.rb +5 -0
- data/lib/genki/generators/app/files/app/home.rb.tt +6 -0
- data/lib/genki/generators/app/files/config.ru +1 -2
- data/lib/genki/http/application.rb +28 -0
- data/lib/genki/http/controller.rb +64 -10
- data/lib/genki/http/request.rb +9 -4
- data/lib/genki/http/route.rb +48 -3
- data/lib/genki/http/router.rb +16 -7
- data/lib/genki/http/server.rb +13 -4
- data/lib/genki/utils/logger.rb +23 -0
- data/lib/genki/version.rb +1 -1
- metadata +32 -8
- data/config.ru +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf3e4aa7266f53faf1b6413a3f893f50929cb2a8
|
4
|
+
data.tar.gz: 2077f807cdd492edc7b7c0b4fb57c66b3acc0c7b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1313133aae4be8b691957634d2f6bae09050697da2b17eb5653dfbfcdedb54204eddd180f1fbc29822bccead51f6e505809a296d630c75de9bec03990b547de
|
7
|
+
data.tar.gz: 190e996f028e7c2cc0eb84a70f660f42b55793b18d2ddfd7ad0376c2b6d47fe90796d7980d514f6df82425691ca2d39311128373540ed7e9b1acbde4b9e61c1d
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
|
2
2
|
# URISchemes: http, https
|
3
3
|
Metrics/LineLength:
|
4
|
-
Max:
|
4
|
+
Max: 120
|
5
5
|
Exclude:
|
6
6
|
- 'spec/**/*'
|
7
7
|
- './genki.gemspec'
|
@@ -9,3 +9,8 @@ Metrics/LineLength:
|
|
9
9
|
Lint/Eval:
|
10
10
|
Exclude:
|
11
11
|
- 'spec/support/capture.rb'
|
12
|
+
|
13
|
+
Style/Documentation:
|
14
|
+
Exclude:
|
15
|
+
- 'spec/**/*'
|
16
|
+
- 'lib/genki.rb'
|
data/.travis.yml
CHANGED
@@ -9,3 +9,7 @@ matrix:
|
|
9
9
|
- rvm: ruby-head
|
10
10
|
fast_finish: true
|
11
11
|
before_install: gem install bundler -v 1.11.2
|
12
|
+
notifications:
|
13
|
+
email: false
|
14
|
+
slack:
|
15
|
+
secure: eGCFU2I8/LIeCuo6cWBatBoLwL8+eDRlcJJH194pMr12S4qkE7mDMeaRUhMvxruZGo/mzvbKzXBJ9SXo8Yyaa4q7DlRH8c4MijIE2VcCNNYeEDp1VC4su/alpEWtxatXNXlc+ZiRAFRvCADjrPXLmeFPhCP20nlfNrX8z6z8Iew/Jzh07GWyyXNIIz83lw/O6PFHNWudEugYpnQf1Z8QnIC18o2l5JKEJIa6W++EJ9Wi9MCBHVQdTNodb4TLVdbKJDtZxUOdTzkPblEVjnFTZQUhuX+NzwVxTdlyonUPypBGqFEhjTbYuxHQawRkfRM1QlLewynvzo+QR2D03EX5tKyqDuUmd4ISoNuKNmXxHuEYLDJJcLiJaL7oae02CYZe3Oayw0AYrhZBWKyfiMN7eFeQN4IG05ox0z1zJ3hy/Il/uWUIuQUp1ai2DnSqnG+fOwV9ivrv1YDA4XX3EIA3FxbU8EsZc9aQBIzIFFrBzwO2u0+Yy/M465n5/EL6R/FA6xIrKmNqcV7ZuXUdfqpsxtA82AG4M1mFps5UVs8roSFfe0nTPPHtL5NANmUbM5TuJS9ZbtOmClRf6jNAiTn9N2iAe9U2SL8b9MKJZTlvReNN6mt21DogKpsvas6uOIhigEu4m07iqtc89gyzWP8RPwM8EZhpr2nsAOMOtSHRPP0=
|
data/README.md
CHANGED
@@ -1,32 +1,52 @@
|
|
1
1
|
# Genki
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/genki)
|
4
|
+
|
3
5
|
[](https://travis-ci.org/genkirb/genki)
|
4
6
|
[](https://codeclimate.com/github/genkirb/genki)
|
5
7
|
[](https://codeclimate.com/github/genkirb/genki/coverage)
|
6
8
|
|
7
|
-
|
9
|
+
A fast and minimalist framework to generate APIs in Ruby.
|
8
10
|
|
9
|
-
|
11
|
+
Genki is a full-stack framework optimized for quick and easy creation of beautiful APIs.
|
10
12
|
|
11
|
-
##
|
13
|
+
## Usage
|
12
14
|
|
13
|
-
|
15
|
+
1. Install Genki:
|
14
16
|
|
15
|
-
|
16
|
-
gem 'genki'
|
17
|
-
```
|
17
|
+
$ gem install genki --pre
|
18
18
|
|
19
|
-
|
19
|
+
You only need `--pre` while we are in beta.
|
20
20
|
|
21
|
-
|
21
|
+
2. Create a new Genki application:
|
22
22
|
|
23
|
-
|
23
|
+
$ genki new app
|
24
24
|
|
25
|
-
|
25
|
+
3. Change directory to `app` and start the server:
|
26
26
|
|
27
|
-
|
27
|
+
$ cd app
|
28
|
+
$ genki server
|
29
|
+
|
30
|
+
You may run `genki help` for more information on the available commands.
|
28
31
|
|
29
|
-
|
32
|
+
### Controllers
|
33
|
+
|
34
|
+
Genki uses controllers to process requests. It differs from `rails`, as we don't enforce any directory structure (except having your files inside an `app` folder), and from `sinatra`, since we have a controller super class that should be inherited from.
|
35
|
+
|
36
|
+
To handle your requests you can simply create a class that inherits from `Genki::Controller` and place it inside `app` folder and it will start processing the matching ones.
|
37
|
+
|
38
|
+
As per the following example:
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
# app/home.rb
|
42
|
+
class Home < Genki::Controller
|
43
|
+
|
44
|
+
get '/' do
|
45
|
+
#params will be available at `params`
|
46
|
+
render 'Hello World'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
```
|
30
50
|
|
31
51
|
## Development
|
32
52
|
|
@@ -36,7 +56,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
36
56
|
|
37
57
|
## Contributing
|
38
58
|
|
39
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
59
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/genkirb/genki. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
40
60
|
|
41
61
|
|
42
62
|
## License
|
data/genki.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ['Diego Silva', 'Leonardo Siqueira']
|
10
10
|
s.email = ['diego.silva@live.com', 'leonardo.prg@gmail.com']
|
11
11
|
|
12
|
-
s.summary = '
|
13
|
-
s.description = 'Genki is a full-stack framework optimized
|
12
|
+
s.summary = 'A fast and minimalist framework to generate APIs in Ruby.'
|
13
|
+
s.description = 'Genki is a full-stack framework optimized for quick and easy creation of beautiful APIs.'
|
14
14
|
s.homepage = 'https://github.com/genkirb/genki'
|
15
15
|
s.license = 'MIT'
|
16
16
|
|
@@ -23,8 +23,9 @@ Gem::Specification.new do |s|
|
|
23
23
|
|
24
24
|
s.add_dependency 'rack', '~> 2.x'
|
25
25
|
s.add_dependency 'thor', '~> 0.19.1'
|
26
|
+
s.add_dependency 'bundler', '~> 1.11'
|
26
27
|
|
27
|
-
s.add_development_dependency '
|
28
|
+
s.add_development_dependency 'erubis', '>= 2.7.0', '< 3.0'
|
28
29
|
s.add_development_dependency 'rake', '~> 10.0'
|
29
30
|
s.add_development_dependency 'rspec', '~> 3.0'
|
30
31
|
s.add_development_dependency 'rubocop', '~> 0.37'
|
data/lib/genki.rb
CHANGED
@@ -1,9 +1,19 @@
|
|
1
1
|
require 'rack'
|
2
2
|
require 'genki/version'
|
3
|
+
require 'genki/utils/logger'
|
3
4
|
require 'genki/cli'
|
4
|
-
require 'genki/
|
5
|
+
require 'genki/errors/route_already_defined_error'
|
6
|
+
require 'genki/errors/route_not_found_error'
|
7
|
+
require 'genki/http/application'
|
5
8
|
require 'genki/http/router'
|
6
9
|
require 'genki/http/route'
|
7
10
|
require 'genki/http/controller'
|
8
11
|
require 'genki/http/request'
|
9
12
|
require 'genki/http/response'
|
13
|
+
require 'genki/http/server'
|
14
|
+
|
15
|
+
module Genki
|
16
|
+
class << self
|
17
|
+
attr_accessor :env
|
18
|
+
end
|
19
|
+
end
|
data/lib/genki/cli.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'thor'
|
2
2
|
require 'genki/generators/app'
|
3
|
+
require 'genki/http/server'
|
3
4
|
|
4
5
|
module Genki
|
5
6
|
#--
|
@@ -22,6 +23,20 @@ module Genki
|
|
22
23
|
say "Genki #{Genki::VERSION}"
|
23
24
|
end
|
24
25
|
|
26
|
+
desc 'server', 'Runs Genki server'
|
27
|
+
method_option :port, aliases: '-p', default: 3000, type: :numeric,
|
28
|
+
banner: 'PORT', desc: 'Run the server on the specified port.'
|
29
|
+
method_option :binding, aliases: '-b', default: 'localhost', type: :string,
|
30
|
+
banner: 'IP', desc: 'The IP to listen on.'
|
31
|
+
method_option :environment, aliases: '-e', default: 'development', type: :string,
|
32
|
+
banner: 'name', desc: 'Specifies with environment to run'
|
33
|
+
def server
|
34
|
+
opt = { Port: options['port'],
|
35
|
+
Host: options['binding'],
|
36
|
+
environment: options['environment'] }
|
37
|
+
Genki::Server.new(opt).start
|
38
|
+
end
|
39
|
+
|
25
40
|
register Generators::App, 'new', 'new APP_NAME', 'Create a new Genki application.'
|
26
41
|
tasks['new'].options = Generators::App.class_options
|
27
42
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Genki
|
2
|
+
#--
|
3
|
+
# Genki::RouteAlreadyDefinedError
|
4
|
+
#
|
5
|
+
# RouteAlreadyDefinedError class
|
6
|
+
#++
|
7
|
+
class RouteAlreadyDefinedError < StandardError
|
8
|
+
def initialize(route)
|
9
|
+
super("Trying to redefine already defined route '#{route}'.")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/genki/generators/app.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
|
3
|
+
module Genki
|
4
|
+
#--
|
5
|
+
# Genki::Application
|
6
|
+
#
|
7
|
+
# APPLICATION CLASS
|
8
|
+
#++
|
9
|
+
class Application
|
10
|
+
def initialize
|
11
|
+
Bundler.require(:default, Genki.env)
|
12
|
+
Dir['./app/**/*.rb'].each { |file| require file }
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
Request.current = Request.new(env)
|
17
|
+
|
18
|
+
response = Router.instance.process
|
19
|
+
rescue RouteNotFoundError
|
20
|
+
response = Response.new('', 404)
|
21
|
+
rescue StandardError => e
|
22
|
+
Logger.error(e)
|
23
|
+
response = Response.new('', 500)
|
24
|
+
ensure
|
25
|
+
response.finish
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
module Genki
|
2
4
|
#--
|
3
5
|
# Genki::Controller
|
@@ -5,32 +7,84 @@ module Genki
|
|
5
7
|
# CONTROLLER CLASS
|
6
8
|
#++
|
7
9
|
class Controller
|
10
|
+
def self.namespace(path, &block)
|
11
|
+
@namespace ||= []
|
12
|
+
@namespace << path
|
13
|
+
|
14
|
+
instance_eval(&block)
|
15
|
+
|
16
|
+
@namespace = nil
|
17
|
+
end
|
18
|
+
|
8
19
|
def self.get(path, &block)
|
9
|
-
Router.instance.route(Route.new(
|
20
|
+
Router.instance.route('GET', Route.new((@namespace || []).push(path).join, &block))
|
10
21
|
end
|
11
22
|
|
12
23
|
def self.post(path, &block)
|
13
|
-
Router.instance.route(Route.new(
|
24
|
+
Router.instance.route('POST', Route.new((@namespace || []).push(path).join, &block))
|
14
25
|
end
|
15
26
|
|
16
27
|
def self.put(path, &block)
|
17
|
-
Router.instance.route(Route.new(
|
28
|
+
Router.instance.route('PUT', Route.new((@namespace || []).push(path).join, &block))
|
18
29
|
end
|
19
30
|
|
20
31
|
def self.delete(path, &block)
|
21
|
-
Router.instance.route(Route.new(
|
32
|
+
Router.instance.route('DELETE', Route.new((@namespace || []).push(path).join, &block))
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.options(path, &block)
|
36
|
+
Router.instance.route('OPTIONS', Route.new((@namespace || []).push(path).join, &block))
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.patch(path, &block)
|
40
|
+
Router.instance.route('PATCH', Route.new((@namespace || []).push(path).join, &block))
|
41
|
+
end
|
42
|
+
|
43
|
+
def render(json: nil, erb: nil, headers: {}, status: 200)
|
44
|
+
body = render_json(json, headers) || render_erb(erb, headers) || ''
|
45
|
+
|
46
|
+
response = Response.new(body, status, headers)
|
47
|
+
cookies.each do |key, value|
|
48
|
+
response.set_cookie(key, value) if cookie_changed?(key, value)
|
49
|
+
end
|
50
|
+
response
|
22
51
|
end
|
23
52
|
|
24
|
-
def
|
25
|
-
|
53
|
+
def request
|
54
|
+
Request.current
|
26
55
|
end
|
27
56
|
|
28
|
-
def
|
29
|
-
|
57
|
+
def params
|
58
|
+
Request.current.params
|
59
|
+
end
|
60
|
+
|
61
|
+
def cookies
|
62
|
+
@_cookies ||= request.cookies.dup
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def render_json(json, headers)
|
68
|
+
return if json.nil?
|
69
|
+
|
70
|
+
headers['content-type'] ||= 'application/json'
|
71
|
+
JSON.dump(json)
|
72
|
+
end
|
73
|
+
|
74
|
+
def render_erb(view, headers)
|
75
|
+
return if view.nil?
|
76
|
+
|
77
|
+
require 'erubis'
|
78
|
+
file = File.expand_path(view, './app/views')
|
79
|
+
headers['content-type'] ||= 'text/html'
|
80
|
+
|
81
|
+
context = instance_variables.map { |var| [var[1..-1], instance_variable_get(var)] }.to_h
|
82
|
+
|
83
|
+
Erubis::Eruby.new(File.read(file)).evaluate(context)
|
30
84
|
end
|
31
85
|
|
32
|
-
def
|
33
|
-
request.
|
86
|
+
def cookie_changed?(key, value)
|
87
|
+
request.cookies[key] != value
|
34
88
|
end
|
35
89
|
end
|
36
90
|
end
|
data/lib/genki/http/request.rb
CHANGED
@@ -5,11 +5,16 @@ module Genki
|
|
5
5
|
# REQUEST CLASS
|
6
6
|
#++
|
7
7
|
class Request < Rack::Request
|
8
|
-
|
8
|
+
def self.current=(request)
|
9
|
+
Thread.current[:request] = request
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.current
|
13
|
+
Thread.current[:request]
|
14
|
+
end
|
9
15
|
|
10
|
-
def
|
11
|
-
|
12
|
-
@route = Route.new(env['REQUEST_METHOD'], env['PATH_INFO'])
|
16
|
+
def json_data?
|
17
|
+
media_type == 'application/json'
|
13
18
|
end
|
14
19
|
end
|
15
20
|
end
|
data/lib/genki/http/route.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
module Genki
|
2
4
|
#--
|
3
5
|
# Genki::Route
|
@@ -5,10 +7,53 @@ module Genki
|
|
5
7
|
# ROUTE CLASS
|
6
8
|
#++
|
7
9
|
class Route
|
8
|
-
attr_reader :
|
10
|
+
attr_reader :path
|
11
|
+
|
12
|
+
def initialize(path, &block)
|
13
|
+
@path = path
|
14
|
+
@params = path.scan(/:[a-z_]+/)
|
15
|
+
@path_regex = '^'.concat(path.gsub(/:[a-z_]+/, '([a-z0-9]+)')).concat('/?$')
|
16
|
+
@action = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def match?(current_path)
|
20
|
+
@parsed_path = current_path.match(@path_regex).to_a[1..-1]
|
21
|
+
end
|
22
|
+
|
23
|
+
def process
|
24
|
+
process_params
|
25
|
+
|
26
|
+
klass = @action.binding.receiver
|
27
|
+
controller = klass.new
|
28
|
+
|
29
|
+
Logger.info("Request processed by #{klass}")
|
30
|
+
|
31
|
+
controller.instance_eval(&@action)
|
32
|
+
end
|
33
|
+
|
34
|
+
def ==(other)
|
35
|
+
other.is_a?(Route) && @path_regex == other.path_regex
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
attr_reader :path_regex
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def process_params
|
45
|
+
params = {}
|
46
|
+
|
47
|
+
@params.each_with_index do |param, index|
|
48
|
+
params[param[1..-1]] = @parsed_path[index]
|
49
|
+
end
|
50
|
+
|
51
|
+
if Request.current.json_data?
|
52
|
+
raw_data = Request.current.env['rack.input'].read
|
53
|
+
params.merge!(JSON.parse(raw_data))
|
54
|
+
end
|
9
55
|
|
10
|
-
|
11
|
-
@signature = "#{verb}#{path}"
|
56
|
+
Request.current.params.merge!(params)
|
12
57
|
end
|
13
58
|
end
|
14
59
|
end
|
data/lib/genki/http/router.rb
CHANGED
@@ -13,16 +13,25 @@ module Genki
|
|
13
13
|
@routes = {}
|
14
14
|
end
|
15
15
|
|
16
|
-
def route(
|
17
|
-
@routes[
|
16
|
+
def route(method, route)
|
17
|
+
@routes[method] ||= []
|
18
|
+
raise RouteAlreadyDefinedError, "#{method} #{route.path}" if @routes[method].include? route
|
19
|
+
@routes[method] << route
|
18
20
|
end
|
19
21
|
|
20
|
-
def process
|
21
|
-
|
22
|
+
def process
|
23
|
+
current_route = nil
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
if @routes[Request.current.request_method]
|
26
|
+
@routes[Request.current.request_method].each do |route|
|
27
|
+
current_route = route.match?(Request.current.path) ? route : nil
|
28
|
+
break if current_route
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
raise RouteNotFoundError unless current_route
|
33
|
+
|
34
|
+
current_route.process
|
26
35
|
end
|
27
36
|
end
|
28
37
|
end
|
data/lib/genki/http/server.rb
CHANGED
@@ -1,14 +1,23 @@
|
|
1
|
+
require 'genki'
|
2
|
+
require 'rack'
|
3
|
+
|
1
4
|
module Genki
|
2
5
|
#--
|
3
6
|
# Genki::Server
|
4
7
|
#
|
5
8
|
# SERVER CLASS
|
6
9
|
#++
|
7
|
-
class Server
|
8
|
-
def
|
9
|
-
|
10
|
+
class Server < Rack::Server
|
11
|
+
def initialize(options = {})
|
12
|
+
options = default_options.merge(options)
|
13
|
+
Genki.env = options[:environment]
|
14
|
+
super
|
15
|
+
end
|
10
16
|
|
11
|
-
|
17
|
+
def start
|
18
|
+
uri = "http://#{options[:Host]}:#{options[:Port]}"
|
19
|
+
puts "Genki application starting in #{options[:environment]} on #{uri}"
|
20
|
+
super
|
12
21
|
end
|
13
22
|
end
|
14
23
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'singleton'
|
3
|
+
|
4
|
+
module Genki
|
5
|
+
#--
|
6
|
+
# Genki::Logger
|
7
|
+
#
|
8
|
+
# Logger class
|
9
|
+
#++
|
10
|
+
class Logger < ::Logger
|
11
|
+
include Singleton
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
super(STDOUT, ::Logger::INFO)
|
15
|
+
end
|
16
|
+
|
17
|
+
class << self
|
18
|
+
::Logger::Severity.constants.each do |level|
|
19
|
+
define_method(level.downcase) { |msg| Logger.instance.method(level.downcase).call(msg) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/genki/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: genki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Diego Silva
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-03-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -46,13 +46,33 @@ dependencies:
|
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '1.11'
|
49
|
-
type: :
|
49
|
+
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '1.11'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: erubis
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 2.7.0
|
63
|
+
- - "<"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '3.0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 2.7.0
|
73
|
+
- - "<"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
56
76
|
- !ruby/object:Gem::Dependency
|
57
77
|
name: rake
|
58
78
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,8 +143,8 @@ dependencies:
|
|
123
143
|
- - ">="
|
124
144
|
- !ruby/object:Gem::Version
|
125
145
|
version: '0'
|
126
|
-
description: Genki is a full-stack framework optimized
|
127
|
-
|
146
|
+
description: Genki is a full-stack framework optimized for quick and easy creation
|
147
|
+
of beautiful APIs.
|
128
148
|
email:
|
129
149
|
- diego.silva@live.com
|
130
150
|
- leonardo.prg@gmail.com
|
@@ -144,20 +164,24 @@ files:
|
|
144
164
|
- Rakefile
|
145
165
|
- bin/console
|
146
166
|
- bin/setup
|
147
|
-
- config.ru
|
148
167
|
- exe/genki
|
149
168
|
- genki.gemspec
|
150
169
|
- lib/genki.rb
|
151
170
|
- lib/genki/cli.rb
|
171
|
+
- lib/genki/errors/route_already_defined_error.rb
|
172
|
+
- lib/genki/errors/route_not_found_error.rb
|
152
173
|
- lib/genki/generators/app.rb
|
153
174
|
- lib/genki/generators/app/files/Gemfile.tt
|
175
|
+
- lib/genki/generators/app/files/app/home.rb.tt
|
154
176
|
- lib/genki/generators/app/files/config.ru
|
177
|
+
- lib/genki/http/application.rb
|
155
178
|
- lib/genki/http/controller.rb
|
156
179
|
- lib/genki/http/request.rb
|
157
180
|
- lib/genki/http/response.rb
|
158
181
|
- lib/genki/http/route.rb
|
159
182
|
- lib/genki/http/router.rb
|
160
183
|
- lib/genki/http/server.rb
|
184
|
+
- lib/genki/utils/logger.rb
|
161
185
|
- lib/genki/version.rb
|
162
186
|
homepage: https://github.com/genkirb/genki
|
163
187
|
licenses:
|
@@ -179,8 +203,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
203
|
version: 1.3.1
|
180
204
|
requirements: []
|
181
205
|
rubyforge_project:
|
182
|
-
rubygems_version: 2.
|
206
|
+
rubygems_version: 2.6.1
|
183
207
|
signing_key:
|
184
208
|
specification_version: 4
|
185
|
-
summary:
|
209
|
+
summary: A fast and minimalist framework to generate APIs in Ruby.
|
186
210
|
test_files: []
|
data/config.ru
DELETED