bats 0.1.2 → 0.2.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/lib/bats.rb +30 -29
- metadata +23 -49
- data/README +0 -23
- data/lib/bats/modules/classbaker.rb +0 -26
- data/lib/bats/modules/httpresponse.rb +0 -42
- data/lib/bats/modules/metaid.rb +0 -16
- data/lib/bats/modules/wizarding.rb +0 -28
- data/lib/bats/yaml/statuses.yaml +0 -21
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 00046bcaaeda3ff965bebd405f0a03b367dd6500
|
4
|
+
data.tar.gz: c4a3f5280aedb96615f2981e073025a48b68f79a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5c1d583e920304cded4b0a6969f726ee8f2d3aeedb27dd43e60e4e57ba29c547e657c4d1916da8482c3a5fc3b2117b20712cebd3b9c6edb1913e68d0824e3f3c
|
7
|
+
data.tar.gz: e00329b45b8ebe6c433bdcf17ae44c7e7c49704096a6828a1f79f50369190c2ed687b0069da8c0caac1ef35e62a6aeb909eb6ec08505605b938537ccafc58f1b
|
data/lib/bats.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
%w(
|
2
|
-
|
1
|
+
%w(httpresponse wizarding).each do |f|
|
2
|
+
require_relative "bats/modules/#{f}"
|
3
3
|
end
|
4
4
|
|
5
5
|
class Bats
|
@@ -8,48 +8,49 @@ class Bats
|
|
8
8
|
traits :routes
|
9
9
|
|
10
10
|
def self.inherited c
|
11
|
-
c.traits
|
11
|
+
c.traits(*traits.keys)
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.addRoute m, p, o = nil, &b
|
15
|
-
@traits[
|
16
|
-
@traits[
|
17
|
-
@traits[
|
15
|
+
@traits[:routes] ||= {}
|
16
|
+
@traits[:routes][m] ||= {}
|
17
|
+
@traits[:routes][m][p] = (block_given?) ? b : o
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
[:get, :post, :put, :delete].each do |m|
|
21
|
+
self.class.send(:define_method, m) do |p, o = nil, &b|
|
22
|
+
addRoute(m, p, o, &b)
|
23
|
+
end
|
24
|
+
end
|
24
25
|
|
25
26
|
def self.redirect l, isTemporary = true
|
26
|
-
i = (
|
27
|
-
s(
|
27
|
+
i = (isTemporary) ? '307' : '301'
|
28
|
+
s(i).headers("Location" => l)
|
28
29
|
end
|
29
30
|
|
30
31
|
def self.s i
|
31
|
-
Class.new(
|
32
|
+
Class.new(::HTTPResponse.const_get("Status#{i}"))
|
32
33
|
end
|
33
34
|
|
34
35
|
def s i
|
35
|
-
Class.new(
|
36
|
+
Class.new(::HTTPResponse.const_get("Status#{i}"))
|
36
37
|
end
|
37
38
|
|
38
|
-
def self.call env; new.call(
|
39
|
+
def self.call env; new.call(env); end
|
39
40
|
def call env
|
40
|
-
method = env[
|
41
|
-
path = env[
|
41
|
+
method = env['REQUEST_METHOD'].downcase.to_sym
|
42
|
+
path = env['PATH_INFO']
|
42
43
|
matches ||= nil
|
43
44
|
if @routes && @routes[method] then
|
44
|
-
if @routes[method].include?(
|
45
|
-
route = @routes[method][
|
45
|
+
if @routes[method].include?(path) then
|
46
|
+
route = @routes[method][path]
|
46
47
|
else
|
47
48
|
@routes[method].each do | p, b |
|
48
|
-
if p.kind_of?(
|
49
|
-
if matches = path.match(
|
50
|
-
matches = matches[
|
49
|
+
if p.kind_of?(Regexp) then
|
50
|
+
if matches = path.match(p) then
|
51
|
+
matches = matches[1, matches.length - 1]
|
51
52
|
matches.map! do | i |
|
52
|
-
i = (
|
53
|
+
i = (i) ? i : ''
|
53
54
|
i = i.to_i if i =~ /^\d+$/
|
54
55
|
i
|
55
56
|
end
|
@@ -60,16 +61,16 @@ class Bats
|
|
60
61
|
end
|
61
62
|
end
|
62
63
|
end
|
63
|
-
route ||= s(
|
64
|
-
args = (
|
64
|
+
route ||= s(404)
|
65
|
+
args = (matches) ? [env, *matches] : [env]
|
65
66
|
begin
|
66
|
-
route = route.call(
|
67
|
-
route.call(
|
67
|
+
route = route.call(*args) if route.kind_of?(Proc)
|
68
|
+
route.call(env)
|
68
69
|
rescue
|
69
70
|
b = '<h1>Ooops... The code broke.</h1>'
|
70
|
-
b += "<h3>#{$!.to_s}</h3>#{$!.backtrace.join(
|
71
|
+
b += "<h3>#{$!.to_s}</h3>#{$!.backtrace.join('<br/>')}"
|
71
72
|
route = s(500).body b
|
72
|
-
route.call(
|
73
|
+
route.call(env)
|
73
74
|
end
|
74
75
|
end
|
75
76
|
end
|
metadata
CHANGED
@@ -1,70 +1,44 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: bats
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Hans Oksendahl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
default_executable:
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: rack
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
version:
|
11
|
+
date: 2015-08-08 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
25
13
|
description:
|
26
14
|
email: hansoksendahl@gmail.com
|
27
15
|
executables: []
|
28
|
-
|
29
16
|
extensions: []
|
30
|
-
|
31
|
-
|
32
|
-
- README
|
33
|
-
files:
|
34
|
-
- lib/bats/modules/httpresponse.rb
|
35
|
-
- lib/bats/modules/classbaker.rb
|
36
|
-
- lib/bats/modules/wizarding.rb
|
37
|
-
- lib/bats/modules/metaid.rb
|
38
|
-
- lib/bats/yaml/statuses.yaml
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
39
19
|
- lib/bats.rb
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
20
|
+
homepage: https://rubygems.org/gems/bats
|
21
|
+
licenses:
|
22
|
+
- MIT
|
23
|
+
metadata: {}
|
45
24
|
post_install_message:
|
46
25
|
rdoc_options: []
|
47
|
-
|
48
|
-
require_paths:
|
26
|
+
require_paths:
|
49
27
|
- lib
|
50
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
52
30
|
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
|
56
|
-
|
57
|
-
requirements:
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
58
35
|
- - ">="
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version:
|
61
|
-
version:
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
62
38
|
requirements: []
|
63
|
-
|
64
39
|
rubyforge_project:
|
65
|
-
rubygems_version:
|
40
|
+
rubygems_version: 2.4.6
|
66
41
|
signing_key:
|
67
|
-
specification_version:
|
42
|
+
specification_version: 4
|
68
43
|
summary: A microframework built on Rack.
|
69
44
|
test_files: []
|
70
|
-
|
data/README
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
~~~(^._.^)~~~ Bats!
|
2
|
-
|
3
|
-
A micro-framework.
|
4
|
-
|
5
|
-
Bats! implements an easy to use router on top of Rack for handling REST
|
6
|
-
requests. This makes getting an app up and running ridiculously easy.
|
7
|
-
|
8
|
-
Bats! stays out of your way. It doesn't ask you to use any particular
|
9
|
-
development methodology, templating framework, or other such tom-foolery.
|
10
|
-
|
11
|
-
Example usage:
|
12
|
-
|
13
|
-
# config.ru
|
14
|
-
|
15
|
-
require 'bats'
|
16
|
-
|
17
|
-
class App < Bats
|
18
|
-
get '/' do
|
19
|
-
s( 200 ).b 'Flap flap flap'
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
run App
|
@@ -1,26 +0,0 @@
|
|
1
|
-
%w( metaid wizarding ).each { | f | require "bats/modules/#{f}" }
|
2
|
-
|
3
|
-
module ClassBaker
|
4
|
-
include Metaid
|
5
|
-
|
6
|
-
def makeClass n, c = nil
|
7
|
-
c = ( c.nil? ) ? Class.new : c
|
8
|
-
c = ( c.is_a?( String ) ) ? Class.new( const_get( c ) ) : c
|
9
|
-
const_set n, c
|
10
|
-
c
|
11
|
-
end
|
12
|
-
|
13
|
-
def bakeClass h
|
14
|
-
h.each do | c, o |
|
15
|
-
t = o.include?( :inherit ) ? o[ :inherit ] : nil
|
16
|
-
o.delete( :inherit )
|
17
|
-
i = makeClass( c, t )
|
18
|
-
i.extend( Wizarding )
|
19
|
-
unless o.empty? then
|
20
|
-
i.traits *o.keys
|
21
|
-
o.each { | k, v | i.send( k, v ) }
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'bats/modules/classbaker'
|
2
|
-
|
3
|
-
module HTTPResponse
|
4
|
-
extend ClassBaker
|
5
|
-
|
6
|
-
class Response
|
7
|
-
extend ::Wizarding
|
8
|
-
|
9
|
-
traits :body, :headers, :status
|
10
|
-
|
11
|
-
def self.call env; new.call( env ); end
|
12
|
-
|
13
|
-
def self.h h
|
14
|
-
@traits[:headers].merge!( h )
|
15
|
-
self
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.b b
|
19
|
-
@traits[:body] = b
|
20
|
-
self
|
21
|
-
end
|
22
|
-
|
23
|
-
def call env
|
24
|
-
@headers.merge! 'Content-Length' => @body.length.to_s
|
25
|
-
[ @status, @headers, @body ]
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
require 'yaml'
|
30
|
-
statuses = YAML.load_file( "#{File.expand_path( '../yaml', File.dirname( __FILE__ ) )}/statuses.yaml" ) # Somewhere in the nether regions beyond column 80!
|
31
|
-
statuses.each do | k, v |
|
32
|
-
bakeClass(
|
33
|
-
"Status#{k}" => {
|
34
|
-
:inherit => 'Response',
|
35
|
-
:status => k,
|
36
|
-
:headers => v[0],
|
37
|
-
:body => v[1]
|
38
|
-
}
|
39
|
-
)
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
data/lib/bats/modules/metaid.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# Sorry _why I don't feel like extending Ruby's Object class.
|
2
|
-
module Metaid
|
3
|
-
def metaclass; class << self; self; end; end
|
4
|
-
|
5
|
-
def meta_eval &b
|
6
|
-
metaclass.instance_eval &b
|
7
|
-
end
|
8
|
-
|
9
|
-
def meta_def( n, &b )
|
10
|
-
meta_eval { define_method( n, &b ) }
|
11
|
-
end
|
12
|
-
|
13
|
-
def class_def( n, &b )
|
14
|
-
class_eval { define_method( n, &b ) }
|
15
|
-
end
|
16
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'bats/modules/metaid'
|
2
|
-
|
3
|
-
module Wizarding
|
4
|
-
include Metaid
|
5
|
-
|
6
|
-
def traits *a
|
7
|
-
return @traits if a.empty?
|
8
|
-
attr_accessor *a
|
9
|
-
a.each do | m |
|
10
|
-
@traits ||= {}
|
11
|
-
@traits[m] = nil
|
12
|
-
meta_def m do | *v |
|
13
|
-
@traits[m] = v[0] unless v.empty?
|
14
|
-
( v.empty? ) ? @traits[m] : self
|
15
|
-
end
|
16
|
-
end
|
17
|
-
class_def :initialize do
|
18
|
-
self.class.traits.each do | k, v |
|
19
|
-
instance_variable_set( "@#{k}", v )
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def inherited c
|
25
|
-
c.traits *traits.keys
|
26
|
-
c.instance_variable_set( :@traits, traits.dup )
|
27
|
-
end
|
28
|
-
end
|
data/lib/bats/yaml/statuses.yaml
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
404:
|
2
|
-
- Content-Type: text/plain
|
3
|
-
- '404: Page not found.'
|
4
|
-
301:
|
5
|
-
- Content-Type: text/html
|
6
|
-
Location: '/'
|
7
|
-
- '301: Moved Permanently.'
|
8
|
-
307:
|
9
|
-
- Content-Type: text/html
|
10
|
-
Location: '/'
|
11
|
-
- '307: Moved Temporarily.'
|
12
|
-
200:
|
13
|
-
- Content-Type: text/html
|
14
|
-
- '200: Page Successfully Loaded.'
|
15
|
-
401:
|
16
|
-
- Content-Type: text/html
|
17
|
-
WWW-Authenticate: 'Basic Realm="Bats! Authentication"'
|
18
|
-
- '401: Unauthorized!'
|
19
|
-
500:
|
20
|
-
- Content-Type: text/html
|
21
|
-
- '500: Oh noes... an error.'
|