webservice 0.2.1 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 416e55a694b9934f1c75b576856d80557c2b51aa
4
- data.tar.gz: 0fe846b71eb385cf11d539258f64edc270899b0b
3
+ metadata.gz: ca3b0a962413d171c662477e7626930cfbbc39f4
4
+ data.tar.gz: 437d9beda6547d451098a9cfdb8af7bcef051d08
5
5
  SHA512:
6
- metadata.gz: 9c0d5927c80e79c50e20ed3018167cdc43be38b12f6839bfb080e8cf4ddf3944761d0612b5f0a2966b912845159f3450273c19e1067ca5e4fd252acab1808cf2
7
- data.tar.gz: e4ae8fc7423e975ae7a0337be183ffa4e3107eb071e4d5de89f9afd27d323680bd8c99a6d53b203f10ec08a1437252c49feaa6f6a3af6aed8a884652c45428c6
6
+ metadata.gz: 8ccadcc3b2d95a13fda4de2b9f9259a410231b7bfb6ac854f5552da3ce45f8dd15345e785d6f47b62032b3b4304f21f9ec219d9b624022cb61e541b2e69c1b23
7
+ data.tar.gz: 71d1d5ce9f811b32c498ddf7074f82efd9fa3cb42e45d1e5e6b246b9371033fe0509a443360fb80b415d381d098649d9c34cc5a7d470476f7f4c7ee166165c24
@@ -4,10 +4,10 @@ README.md
4
4
  Rakefile
5
5
  lib/webservice.rb
6
6
  lib/webservice/base.rb
7
- lib/webservice/builder.rb
8
7
  lib/webservice/version.rb
9
8
  test/helper.rb
10
9
  test/service/app.rb
11
10
  test/test_app.rb
12
- test/test_builder.rb
13
- test/test_builder_debug.rb
11
+ test/test_mustermann.rb
12
+ test/test_samples.rb
13
+ test/test_samples_debug.rb
data/Rakefile CHANGED
@@ -19,7 +19,8 @@ Hoe.spec 'webservice' do
19
19
 
20
20
  self.extra_deps = [
21
21
  ['logutils'],
22
- ['rack', '>=2.0.3']
22
+ ['mustermann', '>=2.0.0'],
23
+ ['rack', '>=2.0.3']
23
24
  ]
24
25
 
25
26
  self.licenses = ['Public Domain']
@@ -28,5 +29,4 @@ Hoe.spec 'webservice' do
28
29
  required_ruby_version: '>= 2.3'
29
30
  }
30
31
 
31
-
32
32
  end
@@ -9,14 +9,32 @@ require 'pp'
9
9
 
10
10
  require 'logutils'
11
11
 
12
+ require 'mustermann'
13
+ require 'mustermann/version'
14
+ require 'mustermann/sinatra'
15
+
12
16
  require 'rack'
13
17
 
18
+
14
19
  # our own code
15
20
  require 'webservice/version' # note: let version always go first
16
- require 'webservice/builder'
17
21
  require 'webservice/base'
18
22
 
19
23
 
20
24
 
25
+ module Webservice
26
+ def self.load_file( path )
27
+ code = File.open( path, 'r:bom|utf-8' ).read
28
+ self.load( code )
29
+ end
30
+
31
+ def self.load( code )
32
+ app_class = Class.new( Base ) ## create new app_class or just use Base itself - why? why not?
33
+ app_class.class_eval( code ) ## note: use class_eval (NOT instance_eval)
34
+ app_class
35
+ end
36
+ end # module Webservice
37
+
38
+
21
39
  # say hello
22
40
  puts Webservice.banner if defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG
@@ -4,49 +4,40 @@
4
4
  module Webservice
5
5
 
6
6
  class Base
7
+
8
+ HTTP_VERBS = %w(GET POST PATCH PUT DELETE HEAD OPTIONS)
9
+
10
+
7
11
  class << self
8
12
 
9
13
  ## todo/check: all verbs needed! (supported) - why, why not??
10
- %w(GET POST PATCH PUT DELETE HEAD OPTIONS).each do |method|
14
+ HTTP_VERBS.each do |method|
11
15
  define_method( method.downcase ) do |pattern, &block|
12
- puts "[debug] Webservice::Base.#{method.downcase} - add route #{method} '#{pattern}' to >#{self.name}< (#{self.object_id})"
13
- routes[method] << [compile_pattern(pattern), block]
16
+ puts "[debug] Webservice::Base.#{method.downcase} - add route #{method} '#{pattern}' to #<#{self.name}:#{self.object_id}> : #{self.class.name}"
17
+
18
+ ## note: for now use the sintatra-style patterns (with mustermann)
19
+ routes[method] << [Mustermann::Sinatra.new(pattern), block]
14
20
  end
15
21
  end
16
22
 
17
- ## def builder
18
- ## @builder ||= Rack::Builder.new
19
- ## end
20
23
 
21
24
  def routes
22
25
  @routes ||= Hash.new { |hash, key| hash[key]=[] }
23
26
  end
24
27
 
25
28
 
29
+ ## convenience method
26
30
  def run!
27
- app_class = self ## note: self will be derived class (e.g. App and not Base)
28
- puts "[debug] Webservice::Base.run! - self: >#{app_class.name}< (#{app_class.object_id}) : #{app_class.class.name}" # assume self is class
29
- app_obj = app_class.new
30
- app = Rack::Builder.new
31
- app.map( '/' ) { run app_obj } ## e.g. run App
31
+ puts "[debug] Webservice::Base.run! - self = #<#{self.name}:#{self.object_id}> : #{self.class.name}" # note: assumes self is class
32
+ app = self.new ## note: use self; will be derived class (e.g. App and not Base)
32
33
  port = 4567
33
34
  Rack::Handler.get('webrick').run( app, Port:port ) do |server|
34
35
  ## todo: add traps here - why, why not??
35
36
  end
36
37
  end
37
38
 
39
+ end ## class << self
38
40
 
39
- private
40
-
41
- def compile_pattern( pattern )
42
- keys = []
43
- pattern.gsub!( /(:\w+)/ ) do |match|
44
- keys << $1[1..-1]
45
- '([^/?#]+)'
46
- end
47
- [%r{^#{pattern}$}, keys]
48
- end
49
- end
50
41
 
51
42
 
52
43
  attr_reader :request
@@ -68,9 +59,6 @@ class Base
68
59
  @response.finish
69
60
  end
70
61
 
71
- def session
72
- request.env["rack.session"] || raise("Rack::Session handler is missing")
73
- end
74
62
 
75
63
  def halt( *args )
76
64
  response.status = args.detect{|arg| arg.is_a?(Fixnum) } || 200
@@ -84,11 +72,13 @@ private
84
72
 
85
73
  def route_eval
86
74
  catch(:halt) do
87
- self.class.routes[request.request_method].each do |matcher, block|
88
- if match = request.path_info.match( matcher[0] )
89
- if (captures = match.captures) && !captures.empty?
90
- url_params = Hash[*matcher[1].zip(captures).flatten]
91
- @params = url_params.merge(params)
75
+ self.class.routes[request.request_method].each do |pattern, block|
76
+ ## puts "trying matching route >#{request.path_info}<..."
77
+ url_params = pattern.params( request.path_info )
78
+ if url_params ## note: params returns nil if no match
79
+ ## puts " BINGO! url_params: #{url_params.inspect}"
80
+ if !url_params.empty? ## url_params hash NOT empty (e.g. {}) merge with req params
81
+ @params = url_params.merge( params )
92
82
  end
93
83
  handle_response( instance_eval( &block ))
94
84
  return
@@ -98,8 +88,9 @@ private
98
88
  end
99
89
  end
100
90
 
91
+
101
92
  def handle_response( obj )
102
- puts "[Webservice::Base#handle_response] - obj: #{obj.class.name}"
93
+ puts "[Webservice::Base#handle_response] - obj : #{obj.class.name}"
103
94
 
104
95
  ### todo/fix: set content type to json
105
96
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Webservice
4
4
  MAJOR = 0 ## todo: namespace inside version or something - why? why not??
5
- MINOR = 2
6
- PATCH = 1
5
+ MINOR = 3
6
+ PATCH = 0
7
7
  VERSION = [MAJOR,MINOR,PATCH].join('.')
8
8
 
9
9
  def self.version
@@ -3,15 +3,13 @@ get '/' do
3
3
  "Hello World"
4
4
  end
5
5
 
6
+
6
7
  get '/hello/:name' do
7
8
  "Hello #{params['name']}"
8
9
  end
9
10
 
10
- get '/:message/:name' do
11
- @message = params['message']
12
- @name = params['name']
13
- "#{@message} #{@name}"
14
- end
11
+
12
+ ## note: /halt/404 must be before /:message/:name !! otherwise no match!!!
15
13
 
16
14
  get '/halt/404' do
17
15
  halt 404 # 404 - not found
@@ -23,3 +21,15 @@ get '/halt_error' do
23
21
  ## todo: check why log reports 200-OK (for status code)!!
24
22
  end
25
23
 
24
+
25
+ get '/:message/:name' do
26
+ message = params['message']
27
+ name = params['name']
28
+ "#{message} #{name}"
29
+ end
30
+
31
+ get '/:key(.:format)?' do
32
+ key = params['key']
33
+ fmt = params['format']
34
+ "#{key} #{fmt}"
35
+ end
@@ -15,9 +15,9 @@ class TestApp < MiniTest::Test
15
15
  def app
16
16
  ## return (rack-ready) app object
17
17
  @@app ||= begin
18
- builder = Webservice::Builder.load_file( "#{Webservice.root}/test/service/app.rb" )
19
- pp builder.app_class.routes
20
- builder.app_class.new
18
+ app_class = Webservice.load_file( "#{Webservice.root}/test/service/app.rb" )
19
+ pp app_class.routes
20
+ app_class.new
21
21
  end
22
22
  end
23
23
 
@@ -51,6 +51,22 @@ class TestApp < MiniTest::Test
51
51
  assert_equal %q{"Hallo Welt"}, last_response.body
52
52
  end
53
53
 
54
+
55
+ def test_format
56
+ get '/key.format'
57
+ assert last_response.ok?
58
+ assert_equal %q{"key format"}, last_response.body
59
+
60
+ get '/ottakringer.csv'
61
+ assert last_response.ok?
62
+ assert_equal %q{"ottakringer csv"}, last_response.body
63
+
64
+ get '/ottakringer'
65
+ assert last_response.ok?
66
+ assert_equal %q{"ottakringer "}, last_response.body
67
+ end
68
+
69
+
54
70
  def test_halt
55
71
  ## get '/halt/404'
56
72
  get '/halt/404'
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_mustermann.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestMustermann < MiniTest::Test
12
+
13
+ def test_hello
14
+
15
+ pp Rack::VERSION
16
+ pp Mustermann::VERSION
17
+
18
+ pattern = Mustermann::Sinatra.new( '/:name' )
19
+ pp pattern
20
+ pp pattern.names
21
+
22
+ m = pattern.match( "/test" )
23
+ pp m
24
+ pp m.captures
25
+ params = pattern.params( "/test" )
26
+ pp params
27
+
28
+
29
+ m = pattern.match( "/test/test" )
30
+ pp m
31
+ params = pattern.params( "/test/test" )
32
+ pp params
33
+
34
+ splat = Mustermann::Sinatra.new( '/:prefix/*.*' )
35
+ params = splat.params('/a/b.c') # => { "prefix" => "a", splat => ["b", "c"] }
36
+ pp params
37
+
38
+ fmt = Mustermann::Sinatra.new( '/:name(.:format)?' )
39
+ params = fmt.params( '/hello.json' )
40
+ pp params
41
+ params = fmt.params( '/hello' )
42
+ pp params
43
+
44
+ rnd = Mustermann::Sinatra.new( '/beer/(r|rnd|random)' )
45
+ params = rnd.params( '/beer/rnd' )
46
+ pp params
47
+ params = rnd.params( '/beer/ottakringer' )
48
+ pp params
49
+ params = rnd.params( '/test/beer/ottakringer' )
50
+ pp params
51
+
52
+
53
+ assert true # if we get here - test success
54
+ end
55
+
56
+ end # class TestMustermann
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_samples.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestSamples < MiniTest::Test
12
+
13
+ def test_beer
14
+ app_class = Webservice.load_file( "#{Webservice.root}/samples/beer.rb" )
15
+ pp app_class.routes
16
+
17
+ assert true # if we get here - test success
18
+ end
19
+
20
+ def test_football
21
+ app_class = Webservice.load_file( "#{Webservice.root}/samples/football.rb" )
22
+ pp app_class.routes
23
+
24
+ assert true # if we get here - test success
25
+ end
26
+
27
+ def test_world
28
+ app_class = Webservice.load_file( "#{Webservice.root}/samples/world.rb" )
29
+ pp app_class.routes
30
+
31
+ assert true # if we get here - test success
32
+ end
33
+
34
+ end # class TestSamples
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_samples_debug.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestSamplesDebug < MiniTest::Test
12
+
13
+ def test_debug
14
+ app_class = Webservice.load_file( "#{Webservice.root}/samples/debug.rb" )
15
+ pp app_class.routes
16
+
17
+ assert true # if we get here - test success
18
+ end
19
+
20
+ end # class TestSamplesDebug
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webservice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-18 00:00:00.000000000 Z
11
+ date: 2017-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logutils
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mustermann
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rack
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -81,13 +95,13 @@ files:
81
95
  - Rakefile
82
96
  - lib/webservice.rb
83
97
  - lib/webservice/base.rb
84
- - lib/webservice/builder.rb
85
98
  - lib/webservice/version.rb
86
99
  - test/helper.rb
87
100
  - test/service/app.rb
88
101
  - test/test_app.rb
89
- - test/test_builder.rb
90
- - test/test_builder_debug.rb
102
+ - test/test_mustermann.rb
103
+ - test/test_samples.rb
104
+ - test/test_samples_debug.rb
91
105
  homepage: https://github.com/rubylibs/webservice
92
106
  licenses:
93
107
  - Public Domain
@@ -1,32 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Webservice
4
-
5
- class Builder
6
-
7
- def self.load_file( path)
8
- code = File.open( path, 'r:bom|utf-8' ).read
9
- self.load( code )
10
- end
11
-
12
- def self.load( code )
13
- app_class = Class.new( Base )
14
- app_class.class_eval( code ) ## note: use class_eval (NOT instance_eval)
15
-
16
- builder = Builder.new
17
- builder.app_class = app_class
18
- builder
19
- end
20
-
21
-
22
- include LogUtils::Logging
23
-
24
- attr_accessor :app_class
25
-
26
- def initialize
27
- end
28
-
29
-
30
- end # class Builder
31
-
32
- end # module Webservice
@@ -1,34 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_builder.rb
6
-
7
-
8
- require 'helper'
9
-
10
-
11
- class TestBuilder < MiniTest::Test
12
-
13
- def test_beer_builder
14
- builder = Webservice::Builder.load_file( "#{Webservice.root}/examples/beer.rb" )
15
- pp builder.app_class.routes
16
-
17
- assert true # if we get here - test success
18
- end
19
-
20
- def test_football_builder
21
- builder = Webservice::Builder.load_file( "#{Webservice.root}/examples/football.rb" )
22
- pp builder.app_class.routes
23
-
24
- assert true # if we get here - test success
25
- end
26
-
27
- def test_world_builder
28
- builder = Webservice::Builder.load_file( "#{Webservice.root}/examples/world.rb" )
29
- pp builder.app_class.routes
30
-
31
- assert true # if we get here - test success
32
- end
33
-
34
- end # class TestBuilder
@@ -1,20 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_builder_debug.rb
6
-
7
-
8
- require 'helper'
9
-
10
-
11
- class TestBuilderDebug < MiniTest::Test
12
-
13
- def test_builder
14
- builder = Webservice::Builder.load_file( "#{Webservice.root}/examples/debug.rb" )
15
- pp builder.app_class.routes
16
-
17
- assert true # if we get here - test success
18
- end
19
-
20
- end # class TestBuilderDebug