rack-app 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d3ec73ef1741248aea0a795217bb718ad9aee4a5
4
- data.tar.gz: bee58d13e8db2f14d1ed1bb7b0f06fb6c0429def
3
+ metadata.gz: a061f4202e995da2a1325944ec7586052d30a603
4
+ data.tar.gz: 193cb7950307a6161f8095b9f90073024241daff
5
5
  SHA512:
6
- metadata.gz: 17bdeed0847c57119871824c6eea1defa58a51c595dada79153fa0d1d0d68db8019828a390b20d4d4c29be5d87c383dc45ff5297afad3d3a544a9ce10c39d1b4
7
- data.tar.gz: 913db22c6134df5b7c6213dc7d07bafb9e71bc2d6966e401ab482f5aab76ad62f385a5937ae6f43149815b52133b867a54b6119fb5ac728a05642e269e28f06f
6
+ metadata.gz: 5bccaeb4dcd6599eb14003434dc54dda1cb8d31f93968c7e5fccf1420e7cbdf427d3d6728f897a9557868fa9fb8681c1ebeac8189f5e6a8261d4b202d126f38f
7
+ data.tar.gz: 734d959b060a38c58ecea6f7214d33bf3396c7ba71704c4cb6d90c893086a7cdbb162e41945ea626f9c6c693cad24fff8e5126c1016515056f299c3387c90ecb
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rack-app (0.4.0)
4
+ rack-app (0.5.0)
5
5
  rack
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -80,6 +80,35 @@ Rack::Response as response method.
80
80
 
81
81
  By default if you dont write anything to the response 'body' the endpoint block logic return will be used
82
82
 
83
+ ## Testing
84
+
85
+ use bundled in testing module for writing unit test for your rack application
86
+
87
+ ```ruby
88
+
89
+ require_relative '../../spec_helper'
90
+ require 'rack/app/test'
91
+
92
+ describe MyRackApp do
93
+
94
+ include Rack::App::Test
95
+
96
+ rack_app described_class
97
+
98
+ describe '#something' do
99
+
100
+ subject{ get('/hello', params: {'dog' => 'meat'}, headers: {'X-Cat' => 'fur'}) }
101
+
102
+ it { expect(subject.body).to eq ['world']}
103
+
104
+ it { expect(subject.status).to eq 201 }
105
+
106
+ end
107
+
108
+ end
109
+
110
+ ```
111
+
83
112
  ## Example Apps To start with
84
113
 
85
114
  * [Basic](https://github.com/adamluzsi/rack-app.rb-examples/tree/master/basic)
@@ -111,20 +140,16 @@ i feared do this for Rails that is usually slower than Grape :S
111
140
 
112
141
  ## Roadmap
113
142
 
114
- ### 0.3.0
115
-
116
- * add TESTING module for rspec helpers that allow easy to test controllers
117
-
118
- ### 0.4.0
143
+ ### 0.6.0
119
144
 
120
145
  * serializer block/method for class shared serialization logic
121
146
 
122
- ### 0.5.0
147
+ ### 0.7.0
123
148
 
124
149
  * content_type syntax sugar on class level
125
150
  * response_headers syntax sugar for request processing
126
151
 
127
- ### 0.6.0
152
+ ### 0.8.0
128
153
 
129
154
  * custom error_handler block for api, where Exception class types can be defined to process
130
155
  * NULL Object pattern for error_handler_fetcher
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.0
data/lib/rack/app.rb CHANGED
@@ -5,21 +5,96 @@ class Rack::App
5
5
 
6
6
  require 'rack/app/version'
7
7
 
8
+ require 'rack/app/params'
8
9
  require 'rack/app/utils'
9
10
  require 'rack/app/router'
10
11
  require 'rack/app/endpoint'
11
12
  require 'rack/app/endpoint/not_found'
12
- require 'rack/app/runner'
13
13
 
14
- require 'rack/app/class_methods'
15
- extend Rack::App::ClassMethods
14
+ class << self
16
15
 
17
- require 'rack/app/request_helpers'
16
+ def call(request_env)
17
+ endpoint = router.fetch_endpoint(request_env['REQUEST_METHOD'],request_env['REQUEST_PATH'])
18
+ endpoint.execute(request_env)
19
+ end
18
20
 
19
- include Rack::App::RequestHelpers
21
+ def description(*description_texts)
22
+ @last_description = description_texts.join("\n")
23
+ end
20
24
 
21
- def self.call(request_env)
22
- Rack::App::Runner.response_for(self,request_env)
25
+ def get(path = '/', &block)
26
+ add_route('GET', path, &block)
27
+ end
28
+
29
+ def post(path = '/', &block)
30
+ add_route('POST', path, &block)
31
+ end
32
+
33
+ def put(path = '/', &block)
34
+ add_route('PUT', path, &block)
35
+ end
36
+
37
+ def head(path = '/', &block)
38
+ add_route('HEAD', path, &block)
39
+ end
40
+
41
+ def delete(path = '/', &block)
42
+ add_route('DELETE', path, &block)
43
+ end
44
+
45
+ def options(path = '/', &block)
46
+ add_route('OPTIONS', path, &block)
47
+ end
48
+
49
+ def patch(path = '/', &block)
50
+ add_route('PATCH', path, &block)
51
+ end
52
+
53
+ def router
54
+ @router ||= Rack::App::Router.new
55
+ end
56
+
57
+ def add_route(request_method, request_path, &block)
58
+
59
+ endpoint_properties = {
60
+ request_method: request_method,
61
+ request_path: request_path,
62
+ description: @last_description
63
+ }
64
+
65
+ endpoint = Rack::App::Endpoint.new(
66
+ self, endpoint_properties, &block
67
+ )
68
+
69
+ router.add_endpoint(request_method, request_path, endpoint)
70
+
71
+ @last_description = nil
72
+ return endpoint
73
+
74
+ end
75
+
76
+
77
+ def mount(api_class)
78
+
79
+ unless api_class.is_a?(Class) and api_class <= Rack::App
80
+ raise(ArgumentError, 'Invalid class given for mount, must be a Rack::App')
81
+ end
82
+
83
+ router.merge!(api_class.router)
84
+
85
+ return nil
86
+ end
87
+
88
+ end
89
+
90
+ def params
91
+ @__params__ ||= Rack::App::Params.new(request.env).to_hash
92
+ end
93
+
94
+ def status(new_status=nil)
95
+ response.status= new_status.to_i unless new_status.nil?
96
+
97
+ response.status
23
98
  end
24
99
 
25
100
  attr_writer :request, :response
@@ -1,5 +1,5 @@
1
1
  require 'cgi'
2
- class Rack::App::RequestHelpers::Params
2
+ class Rack::App::Params
3
3
 
4
4
  def initialize(request_env)
5
5
  @request_env = request_env
@@ -0,0 +1,63 @@
1
+ require 'uri'
2
+ require 'rack/app'
3
+ module Rack::App::Test
4
+
5
+ # magic ;)
6
+ def self.included(klass)
7
+
8
+ klass.define_singleton_method :rack_app do |rack_app_class=nil, &constructor|
9
+
10
+ subject_app = rack_app_class.is_a?(Class) ? rack_app_class : Class.new(Rack::App)
11
+ subject_app.instance_eval(&constructor) unless constructor.nil?
12
+
13
+ klass.__send__ :define_method, :rack_app do
14
+ @rack_app = subject_app
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ [:get, :post, :put, :delete, :options].each do |request_method|
22
+ define_method(request_method) do |url, properties={}|
23
+ rack_app.call(request_env_by(request_method, url, properties)).last
24
+ end
25
+ end
26
+
27
+ def format_properties(properties)
28
+ raise('use hash format such as params: {"key" => "value"} or headers with the same concept') unless properties.is_a?(Hash)
29
+ properties[:params] ||= {}
30
+ properties[:headers]||= {}
31
+
32
+ properties
33
+ end
34
+
35
+ def request_env_by(request_method, url, raw_properties)
36
+
37
+ properties = format_properties(raw_properties)
38
+ URI.encode_www_form(properties[:params].to_a)
39
+
40
+ additional_headers = properties[:headers].reduce({}) { |m,(k, v)| m.merge("HTTP_#{k.to_s.gsub('-', '_').upcase}" => v.to_s) }
41
+
42
+ {
43
+ "REMOTE_ADDR" => "192.168.56.1",
44
+ "REQUEST_METHOD" => request_method.to_s.upcase,
45
+ "REQUEST_PATH" => url,
46
+ "REQUEST_URI" => url,
47
+ "SERVER_PROTOCOL" => "HTTP/1.1",
48
+ "CONTENT_LENGTH" => "0",
49
+ "CONTENT_TYPE" => "application/x-www-form-urlencoded",
50
+ "SERVER_NAME" => "hds-dev.ett.local",
51
+ "SERVER_PORT" => "80",
52
+ "QUERY_STRING" => URI.encode_www_form(properties[:params].to_a),
53
+ "HTTP_VERSION" => "HTTP/1.1",
54
+ "HTTP_USER_AGENT" => "spec",
55
+ "HTTP_HOST" => "spec.local",
56
+ "HTTP_ACCEPT_ENCODING" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
57
+ "HTTP_ACCEPT" => "*/*",
58
+ "HTTP_CONNECTION" => "close"
59
+ }.merge(additional_headers)
60
+
61
+ end
62
+
63
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-26 00:00:00.000000000 Z
11
+ date: 2015-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -85,15 +85,13 @@ files:
85
85
  - VERSION
86
86
  - bin/setup
87
87
  - lib/rack/app.rb
88
- - lib/rack/app/class_methods.rb
89
88
  - lib/rack/app/endpoint.rb
90
89
  - lib/rack/app/endpoint/not_found.rb
91
- - lib/rack/app/request_helper/params.rb
92
- - lib/rack/app/request_helpers.rb
90
+ - lib/rack/app/params.rb
93
91
  - lib/rack/app/router.rb
94
92
  - lib/rack/app/router/dynamic.rb
95
93
  - lib/rack/app/router/static.rb
96
- - lib/rack/app/runner.rb
94
+ - lib/rack/app/test.rb
97
95
  - lib/rack/app/utils.rb
98
96
  - lib/rack/app/version.rb
99
97
  - rack-app.gemspec
@@ -1,69 +0,0 @@
1
- module Rack::App::ClassMethods
2
-
3
- def description(*description_texts)
4
- @last_description = description_texts.join("\n")
5
- end
6
-
7
- def get(path = '/', &block)
8
- add_route('GET', path, &block)
9
- end
10
-
11
- def post(path = '/', &block)
12
- add_route('POST', path, &block)
13
- end
14
-
15
- def put(path = '/', &block)
16
- add_route('PUT', path, &block)
17
- end
18
-
19
- def head(path = '/', &block)
20
- add_route('HEAD', path, &block)
21
- end
22
-
23
- def delete(path = '/', &block)
24
- add_route('DELETE', path, &block)
25
- end
26
-
27
- def options(path = '/', &block)
28
- add_route('OPTIONS', path, &block)
29
- end
30
-
31
- def patch(path = '/', &block)
32
- add_route('PATCH', path, &block)
33
- end
34
-
35
- def router
36
- @static_router ||= Rack::App::Router.new
37
- end
38
-
39
- def add_route(request_method, request_path, &block)
40
-
41
- endpoint = Rack::App::Endpoint.new(
42
- self,
43
- {
44
- request_method: request_method,
45
- request_path: request_path,
46
- description: @last_description
47
- },
48
- &block
49
- )
50
-
51
- router.add_endpoint(request_method,request_path,endpoint)
52
-
53
- @last_description = nil
54
- endpoint
55
- end
56
-
57
-
58
- def mount(api_class)
59
-
60
- unless api_class.is_a?(Class) and api_class <= Rack::App
61
- raise(ArgumentError, 'Invalid class given for mount, must be a Rack::App')
62
- end
63
-
64
- router.merge!(api_class.router)
65
-
66
- nil
67
- end
68
-
69
- end
@@ -1,15 +0,0 @@
1
- module Rack::App::RequestHelpers
2
-
3
- require 'rack/app/request_helper/params'
4
-
5
- def params
6
- @__request_params__ ||= Rack::App::RequestHelpers::Params.new(request.env).to_hash
7
- end
8
-
9
- def status(new_status=nil)
10
- response.status= new_status.to_i unless new_status.nil?
11
-
12
- response.status
13
- end
14
-
15
- end
@@ -1,15 +0,0 @@
1
- module Rack::App::Runner
2
- extend self
3
-
4
- def response_for(api_class, request_env)
5
- endpoint = fetch_endpoint(api_class,request_env['REQUEST_METHOD'],request_env['REQUEST_PATH'])
6
- endpoint.execute(request_env)
7
- end
8
-
9
- protected
10
-
11
- def fetch_endpoint(api_class, request_method, request_path)
12
- api_class.router.fetch_endpoint(request_method, request_path)
13
- end
14
-
15
- end