sk-hoth 0.0.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/README.rdoc +69 -39
  2. data/THANKS.md +9 -0
  3. data/TODO +2 -0
  4. data/lib/hoth/encoding/json.rb +28 -0
  5. data/lib/hoth/encoding/no_op.rb +19 -0
  6. data/lib/hoth/endpoint.rb +28 -0
  7. data/lib/hoth/exceptions.rb +14 -0
  8. data/lib/hoth/extension/core/exception.rb +15 -0
  9. data/lib/hoth/modules.rb +27 -0
  10. data/lib/hoth/providers/bertrpc_provider.rb +35 -0
  11. data/lib/hoth/providers/rack_provider.rb +45 -0
  12. data/lib/hoth/service.rb +50 -0
  13. data/lib/hoth/service_definition.rb +18 -0
  14. data/lib/hoth/service_module.rb +49 -0
  15. data/lib/hoth/service_registry.rb +34 -0
  16. data/lib/hoth/services.rb +51 -0
  17. data/lib/hoth/transport/base.rb +19 -0
  18. data/lib/hoth/transport/bert.rb +87 -0
  19. data/lib/hoth/transport/http.rb +41 -0
  20. data/lib/hoth/transport/http_hmac.rb +37 -0
  21. data/lib/hoth/transport/workling.rb +23 -0
  22. data/lib/hoth/transport.rb +48 -0
  23. data/lib/hoth/util/logger.rb +46 -0
  24. data/lib/hoth.rb +56 -0
  25. data/spec/spec_helper.rb +7 -26
  26. data/spec/unit/encoding/json_spec.rb +25 -0
  27. data/spec/unit/endpoint_spec.rb +34 -0
  28. data/spec/unit/extension/core/exception_spec.rb +34 -0
  29. data/spec/unit/hoth_spec.rb +30 -0
  30. data/spec/unit/providers/rack_provider_spec.rb +49 -0
  31. data/spec/unit/service_definition_spec.rb +21 -0
  32. data/spec/unit/service_module_spec.rb +59 -0
  33. data/spec/unit/service_spec.rb +77 -0
  34. data/spec/unit/transport/base_spec.rb +43 -0
  35. data/spec/unit/transport/http_hmac_spec.rb +44 -0
  36. data/spec/unit/transport/http_spec.rb +73 -0
  37. data/spec/unit/transport/workling_spec.rb +42 -0
  38. data/spec/unit/transport_spec.rb +29 -0
  39. metadata +86 -23
  40. data/lib/king_soa/rack/middleware.rb +0 -47
  41. data/lib/king_soa/registry.rb +0 -55
  42. data/lib/king_soa/service.rb +0 -88
  43. data/lib/king_soa.rb +0 -56
  44. data/spec/king_soa/rack/middleware_spec.rb +0 -36
  45. data/spec/king_soa/registry_spec.rb +0 -28
  46. data/spec/king_soa/service_spec.rb +0 -46
  47. data/spec/server/app.rb +0 -26
@@ -0,0 +1,44 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../../', 'spec_helper'))
2
+
3
+ module Hoth
4
+ module Transport
5
+ describe HttpHmac do
6
+
7
+ before(:each) do
8
+ @service_mock = mock("ServiceMock")
9
+
10
+ end
11
+
12
+ it "should post payload encoded with JSON" do
13
+ stub_request(:any, "localhost:3000/execute")
14
+ @service_mock.should_receive(:endpoint).and_return(endpoint = mock("EndpointMock"))
15
+ @service_mock.should_receive(:name).and_return("service_name")
16
+ endpoint.should_receive(:to_url).and_return("http://localhost:3000/execute")
17
+ encoder = mock("JsonEncoderMock")
18
+ encoder.should_receive(:encode).with("params").and_return("encoded_params")
19
+
20
+ transport = HttpHmac.new(@service_mock, {:encoder => encoder})
21
+ transport.hmac_access_id = 'an-hmac_access_id'
22
+ transport.hmac_secret = 'an-hmac_secret'
23
+ transport.post_payload("params")
24
+ transport.req['Authorization'].should include('KingHmac::Auth an-hmac_access_id:')
25
+ end
26
+
27
+ describe "Error Handling" do
28
+
29
+ before(:each) do
30
+ service_mock = mock("ServiceMock")
31
+ @params = {:first_name => "Seras", :last_name => "Victoria"}
32
+ encoder = mock("JsonEncoderMock")
33
+ @transport = HttpHmac.new(service_mock, {:encoder => encoder})
34
+ end
35
+
36
+ it "should handle hmac missing error" do
37
+ lambda { @transport.call_remote_with(@params) }.should raise_error(TransportError)
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,73 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../../', 'spec_helper'))
2
+
3
+ module Hoth
4
+ module Transport
5
+ describe Http do
6
+
7
+ before(:each) do
8
+ @service_mock = mock("ServiceMock")
9
+ end
10
+
11
+ it "should call a remote via http" do
12
+ params = {:first_name => "Seras", :last_name => "Victoria"}
13
+
14
+ transport = Http.new(@service_mock)
15
+ transport.should_receive(:post_payload).with([params])
16
+ transport.call_remote_with(params)
17
+ end
18
+
19
+ it "should post payload encoded with JSON" do
20
+ @service_mock.should_receive(:endpoint).and_return(endpoint = mock("EndpointMock"))
21
+ @service_mock.should_receive(:name).and_return("service_name")
22
+ endpoint.should_receive(:to_url).and_return("http://localhost:3000/execute")
23
+
24
+ encoder = mock("JsonEncoderMock")
25
+ encoder.should_receive(:encode).with("params").and_return("encoded_params")
26
+
27
+ URI.should_receive(:parse).with("http://localhost:3000/execute").and_return(uri = mock("URIMock"))
28
+ Net::HTTP.should_receive(:post_form).with(uri, {"name" => "service_name", "params" => "encoded_params"})
29
+
30
+ transport = Http.new(@service_mock, {:encoder => encoder})
31
+ transport.post_payload("params")
32
+ end
33
+
34
+ describe "Error Handling" do
35
+
36
+ before(:each) do
37
+ service_mock = mock("ServiceMock")
38
+ @params = {:first_name => "Seras", :last_name => "Victoria"}
39
+ encoder = mock("JsonEncoderMock")
40
+ @transport = Http.new(service_mock, {:encoder => encoder})
41
+ end
42
+
43
+ it "should handle http connection error" do
44
+ @transport.should_receive(:post_payload).and_raise(Exception)
45
+ lambda { @transport.call_remote_with(@params) }.should raise_error(TransportError)
46
+ end
47
+
48
+ it "should handle successful response" do
49
+ @transport.should_receive(:post_payload).and_return(response = Net::HTTPSuccess.allocate)
50
+ response.should_receive(:body).twice.and_return(response_body = '{"result" : "return_value"}')
51
+ @transport.encoder.should_receive(:decode).with(response_body).and_return({"result" => "return_value"})
52
+ @transport.call_remote_with(@params)
53
+ end
54
+
55
+ it "should handle remote server error" do
56
+ @transport.should_receive(:post_payload).and_return(response = Net::HTTPServerError.allocate)
57
+ response.should_receive(:body).any_number_of_times.and_return(response_body = '{"error" : "ServerError"}')
58
+ @transport.encoder.should_receive(:decode).with(response_body).and_return({"result" => "return_value"})
59
+ lambda { @transport.call_remote_with(@params) }.should raise_error(TransportError)
60
+ end
61
+
62
+ it "should handle any other HTTP errors" do
63
+ [Net::HTTPRedirection, Net::HTTPClientError, Net::HTTPInformation, Net::HTTPUnknownResponse].each do |http_response|
64
+ @transport.should_receive(:post_payload).and_return(response = http_response.allocate)
65
+ response.should_receive(:body).any_number_of_times.and_return('{"error" : "ServerError"}')
66
+ lambda { @transport.call_remote_with(@params) }.should raise_error(TransportError)
67
+ end
68
+ end
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,42 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../../', 'spec_helper'))
2
+
3
+ module Hoth
4
+ module Transport
5
+
6
+ describe "Workling" do
7
+
8
+ it "should send publish a message via SimplePublisher" do
9
+ endpoint = mock("EndpointMock")
10
+ endpoint.should_receive(:host).and_return("localhost")
11
+ endpoint.should_receive(:port).and_return("22122")
12
+
13
+ service_module = mock("ServiceModule")
14
+ service_module.should_receive(:name).and_return("TestServiceModule")
15
+
16
+ service = mock("ServiceMock")
17
+ service.should_receive(:name).and_return("TestService")
18
+ service.should_receive(:endpoint).any_number_of_times.and_return(endpoint)
19
+ service.should_receive(:module).any_number_of_times.and_return(service_module)
20
+
21
+ SimplePublisher::Topic.should_receive(:new).with(:name => "test_service_module_subscribers__test_service").and_return(topic = mock("Topic"))
22
+
23
+ SimplePublisher::StarlingConnection.should_receive(:new).with(:host => "localhost", :port => "22122").and_return(connection = mock("Connection"))
24
+
25
+ SimplePublisher::Publisher.should_receive(:new).with(
26
+ :topic => topic,
27
+ :connection => connection
28
+ ).and_return(publisher = mock("PublisherMock"))
29
+
30
+ uid = "GC-123546"
31
+ email_address = "test@example.com"
32
+
33
+ publisher.should_receive(:publish).with([uid, email_address])
34
+
35
+ transport = Workling.new(service)
36
+ transport.call_remote_with(uid, email_address)
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
+
3
+ module Hoth
4
+ describe Transport do
5
+
6
+ it "should create a new transport by transport name for a given service" do
7
+ service = mock("ServiceMock")
8
+ Transport.should_receive(:new_transport_with_encoding).with(:transport_name, service)
9
+ Transport.create(:transport_name, service)
10
+ end
11
+
12
+ it "should create a new transport instance with encoding from a transport name" do
13
+ transport = Transport.new_transport_with_encoding :json_via_http, mock("ServiceMock")
14
+ transport.should be_kind_of(Transport::Http)
15
+ transport.encoder.should == Encoding::Json
16
+ end
17
+
18
+ it "should create a new transport instance with encoding from a transport alias" do
19
+ transport = Transport.new_transport_with_encoding :http, mock("ServiceMock")
20
+ transport.should be_kind_of(Transport::Http)
21
+ transport.encoder.should == Encoding::Json
22
+ end
23
+
24
+ it "should raise an exception if transport name does not exist" do
25
+ lambda { Transport.new_transport_with_encoding :not_existing_transport, mock("ServiceMock") }.should raise_error(TransportException)
26
+ end
27
+
28
+ end
29
+ end
metadata CHANGED
@@ -4,21 +4,22 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
+ - 3
7
8
  - 0
8
- - 1
9
- version: 0.0.1
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
+ - Dirk Breuer
12
13
  - Georg Leciejewski
13
14
  autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-05-08 00:00:00 +02:00
18
+ date: 2010-04-11 00:00:00 +02:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
- name: curb
22
+ name: activesupport
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
24
25
  requirements:
@@ -30,7 +31,7 @@ dependencies:
30
31
  type: :runtime
31
32
  version_requirements: *id001
32
33
  - !ruby/object:Gem::Dependency
33
- name: json
34
+ name: bertrpc
34
35
  prerelease: false
35
36
  requirement: &id002 !ruby/object:Gem::Requirement
36
37
  requirements:
@@ -42,7 +43,7 @@ dependencies:
42
43
  type: :runtime
43
44
  version_requirements: *id002
44
45
  - !ruby/object:Gem::Dependency
45
- name: king_hmac
46
+ name: json
46
47
  prerelease: false
47
48
  requirement: &id003 !ruby/object:Gem::Requirement
48
49
  requirements:
@@ -54,7 +55,7 @@ dependencies:
54
55
  type: :runtime
55
56
  version_requirements: *id003
56
57
  - !ruby/object:Gem::Dependency
57
- name: rspec
58
+ name: king_hmac
58
59
  prerelease: false
59
60
  requirement: &id004 !ruby/object:Gem::Requirement
60
61
  requirements:
@@ -63,10 +64,10 @@ dependencies:
63
64
  segments:
64
65
  - 0
65
66
  version: "0"
66
- type: :development
67
+ type: :runtime
67
68
  version_requirements: *id004
68
69
  - !ruby/object:Gem::Dependency
69
- name: webmock
70
+ name: rspec
70
71
  prerelease: false
71
72
  requirement: &id005 !ruby/object:Gem::Requirement
72
73
  requirements:
@@ -77,11 +78,35 @@ dependencies:
77
78
  version: "0"
78
79
  type: :development
79
80
  version_requirements: *id005
81
+ - !ruby/object:Gem::Dependency
82
+ name: simple_publisher
83
+ prerelease: false
84
+ requirement: &id006 !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ type: :development
92
+ version_requirements: *id006
93
+ - !ruby/object:Gem::Dependency
94
+ name: webmock
95
+ prerelease: false
96
+ requirement: &id007 !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :development
104
+ version_requirements: *id007
80
105
  description: |
81
106
  Creating a SOA requires a centralized location to define all services within the
82
107
  SOA. Furthermore you want to know where to deploy those services.
83
108
 
84
- email: gl@salesking.eu
109
+ email: dirk.breuer@gmail.com
85
110
  executables: []
86
111
 
87
112
  extensions: []
@@ -89,20 +114,49 @@ extensions: []
89
114
  extra_rdoc_files:
90
115
  - LICENSE
91
116
  - README.rdoc
117
+ - TODO
92
118
  files:
93
119
  - README.rdoc
94
- - lib/king_soa.rb
95
- - lib/king_soa/rack/middleware.rb
96
- - lib/king_soa/registry.rb
97
- - lib/king_soa/service.rb
98
- - spec/king_soa/rack/middleware_spec.rb
99
- - spec/king_soa/registry_spec.rb
100
- - spec/king_soa/service_spec.rb
101
- - spec/server/app.rb
120
+ - THANKS.md
121
+ - lib/hoth.rb
122
+ - lib/hoth/encoding/json.rb
123
+ - lib/hoth/encoding/no_op.rb
124
+ - lib/hoth/endpoint.rb
125
+ - lib/hoth/exceptions.rb
126
+ - lib/hoth/extension/core/exception.rb
127
+ - lib/hoth/modules.rb
128
+ - lib/hoth/providers/bertrpc_provider.rb
129
+ - lib/hoth/providers/rack_provider.rb
130
+ - lib/hoth/service.rb
131
+ - lib/hoth/service_definition.rb
132
+ - lib/hoth/service_module.rb
133
+ - lib/hoth/service_registry.rb
134
+ - lib/hoth/services.rb
135
+ - lib/hoth/transport.rb
136
+ - lib/hoth/transport/base.rb
137
+ - lib/hoth/transport/bert.rb
138
+ - lib/hoth/transport/http.rb
139
+ - lib/hoth/transport/http_hmac.rb
140
+ - lib/hoth/transport/workling.rb
141
+ - lib/hoth/util/logger.rb
102
142
  - spec/spec_helper.rb
143
+ - spec/unit/encoding/json_spec.rb
144
+ - spec/unit/endpoint_spec.rb
145
+ - spec/unit/extension/core/exception_spec.rb
146
+ - spec/unit/hoth_spec.rb
147
+ - spec/unit/providers/rack_provider_spec.rb
148
+ - spec/unit/service_definition_spec.rb
149
+ - spec/unit/service_module_spec.rb
150
+ - spec/unit/service_spec.rb
151
+ - spec/unit/transport/base_spec.rb
152
+ - spec/unit/transport/http_hmac_spec.rb
153
+ - spec/unit/transport/http_spec.rb
154
+ - spec/unit/transport/workling_spec.rb
155
+ - spec/unit/transport_spec.rb
103
156
  - LICENSE
157
+ - TODO
104
158
  has_rdoc: true
105
- homepage: http://github.com/salesking/king_soa
159
+ homepage: http://github.com/salesking/hoth
106
160
  licenses: []
107
161
 
108
162
  post_install_message:
@@ -133,7 +187,16 @@ specification_version: 3
133
187
  summary: Registry and deployment description abstraction for SOA-Services. Tweaked by SalesKing
134
188
  test_files:
135
189
  - spec/spec_helper.rb
136
- - spec/king_soa/registry_spec.rb
137
- - spec/king_soa/service_spec.rb
138
- - spec/king_soa/rack/middleware_spec.rb
139
- - spec/server/app.rb
190
+ - spec/unit/service_module_spec.rb
191
+ - spec/unit/service_spec.rb
192
+ - spec/unit/transport_spec.rb
193
+ - spec/unit/encoding/json_spec.rb
194
+ - spec/unit/providers/rack_provider_spec.rb
195
+ - spec/unit/service_definition_spec.rb
196
+ - spec/unit/extension/core/exception_spec.rb
197
+ - spec/unit/transport/http_hmac_spec.rb
198
+ - spec/unit/transport/workling_spec.rb
199
+ - spec/unit/transport/http_spec.rb
200
+ - spec/unit/transport/base_spec.rb
201
+ - spec/unit/hoth_spec.rb
202
+ - spec/unit/endpoint_spec.rb
@@ -1,47 +0,0 @@
1
- module KingSoa::Rack
2
- class Middleware
3
-
4
- def initialize(app)
5
- @app = app
6
- end
7
-
8
- # Takes incoming soa requests and calls the passed in method with given params
9
- def call(env)
10
- # Hoth::Logger.debug "env: #{env.inspect}"
11
- if env["PATH_INFO"] =~ /^\/soa/
12
- begin
13
- req = Rack::Request.new(env)
14
- # find service
15
- service = KingSoa.find(req.params["name"])
16
- # authenticate
17
- authenticated?(service, req.params["auth_key"])
18
- # perform method with decoded params
19
- result = service.perform(*service.decode( req.params["params"] ))
20
- # encode result
21
- encoded_result = service.encode({"result" => result})
22
- # and return
23
- [ 200,
24
- {'Content-Type' => 'application/json',
25
- 'Content-Length' => "#{encoded_result.length}"},
26
- [encoded_result] ]
27
- rescue Exception => e
28
- #Hoth::Logger.debug "e: #{e.message}"
29
- if service
30
- encoded_error = service.encode({"error" => e})
31
- [500, {'Content-Type' => 'application/json', 'Content-Length' => "#{encoded_error.length}"}, [encoded_error]]
32
- else
33
- encoded_error = {"error" => "An error occurred! (#{e.message})"}.to_json
34
- [500, {'Content-Type' => "application/json", 'Content-Length' => "#{encoded_error.length}"}, [encoded_error]]
35
- end
36
- end
37
- else
38
- @app.call(env)
39
- end
40
- end
41
-
42
- def authenticated?(service, key)
43
- raise "Please provide a valid authentication key" unless service.auth_key == key
44
- end
45
-
46
- end
47
- end
@@ -1,55 +0,0 @@
1
- module KingSoa
2
- class Registry
3
- include Singleton
4
-
5
- ############################################################################
6
- # Class methods .. only use those since we are in a Singleton
7
- ############################################################################
8
-
9
- # Get a method by a given name
10
- def self.[](service_name)
11
- instance[service_name]
12
- end
13
- # add a service
14
- def self.<<(service)
15
- instance << service
16
- end
17
- # Return an array of defined services
18
- def self.services
19
- instance.services
20
- end
21
-
22
- # find a group of services identified by starting with the same string
23
- #
24
- def group(name)
25
- instance.group(name)
26
- end
27
- ############################################################################
28
- # Instance methods - not directly accessible => Singleton
29
- ############################################################################
30
-
31
- # returns all available methods
32
- def services
33
- @services ||= []
34
- end
35
-
36
- # Add a new method onto the stack
37
- def <<(service)
38
- (services || []) << service
39
- end
40
-
41
- # Get a method by a given name
42
- def [](service_name)
43
- name = service_name.to_sym
44
- services.detect {|s| s.name == name }
45
- end
46
-
47
- def group(service_name)
48
- name = service_name.to_sym
49
- # srvs = []
50
- services.collect {|s| s.name[/^#{name}/] }
51
- end
52
-
53
-
54
- end
55
- end
@@ -1,88 +0,0 @@
1
- module KingSoa
2
- class Service
3
- # endpoint url
4
- attr_accessor :debug, :name, :auth_key, :queue
5
- attr_reader :request
6
-
7
- def initialize(opts)
8
- self.name = opts[:name].to_sym
9
- self.url = opts[:url] if opts[:url]
10
- self.queue = opts[:queue] if opts[:queue]
11
- self.auth_key = opts[:auth_key] if opts[:auth_key]
12
- end
13
-
14
- def call_remote(*args)
15
- set_request_opts(args)
16
- resp_code = @request.perform
17
- case resp_code
18
- when 200
19
- return self.decode(@request.response_body)["result"]
20
- else
21
- return self.decode(@request.response_body)["error"]
22
- end
23
- end
24
-
25
- def perform(*args)
26
- result = local_class ? local_class.send(:perform, *args) : call_remote(*args)
27
- return result
28
- end
29
-
30
-
31
- def local_class
32
- @local_class ||= begin
33
- "#{self.name.to_s.camelize}".constantize
34
- rescue NameError => e # no local implementation
35
- false
36
- end
37
- end
38
-
39
- def request
40
- @request ||= Typhoeus::Easy.new
41
- end
42
-
43
- def set_request_opts(args)
44
- request.url = url
45
- request.method = :post
46
- request.timeout = 100 # milliseconds
47
- request.params = params(args)
48
- request.user_agent = 'KingSoa'
49
- request.follow_location = true
50
- request.verbose = 1 if debug
51
- end
52
-
53
- # Url receiving the request
54
- # TODO. if not present try to grab from endpoint
55
- def url
56
- @url
57
- end
58
- def url=(url)
59
- @url = "#{url}/soa"
60
- end
61
-
62
- # The params for each soa request consisnt of two values:
63
- # name => the name of the method to call
64
- # params => the parameters for the method
65
- # ==== Parameter
66
- # params<Hash|Array|String>:: will be json encoded
67
- # === Returns
68
- # <Hash{String=>String}>:: params added to the POST body
69
- def params(payload)
70
- { 'name' => name.to_s,
71
- 'params' => encode(payload),
72
- 'auth_key'=> auth_key }
73
- end
74
-
75
- def encode(string)
76
- string.to_json
77
- end
78
-
79
- def decode(string)
80
- begin
81
- JSON.parse(string)
82
- rescue JSON::ParserError => e
83
- raise e
84
- end
85
- end
86
-
87
- end
88
- end
data/lib/king_soa.rb DELETED
@@ -1,56 +0,0 @@
1
- require 'singleton'
2
- require 'json'
3
- require 'typhoeus'
4
- require 'active_support/inflector'
5
-
6
- require 'king_soa/registry'
7
- require 'king_soa/service'
8
- require 'king_soa/rack/middleware'
9
-
10
- # Define available services.
11
- #
12
- # service:
13
- # name: sign_document
14
- # url: "https://msg.salesking.eu"
15
- # auth: 'a-long-random-string'
16
- # queue: a-queue-name
17
- #
18
- #
19
- # method: save_signed_document
20
- # url: "https://www.salesking.eu/soa"
21
- #
22
- #
23
- # after defining your services you can call each of them with
24
- # <tt>Hoth::Services.service_name(params)</tt>
25
- #
26
- # KingSoa.sign_document(counter)
27
- # current_number = Hoth::Services.value_of_counter(counter)
28
- # created_account = Hoth::Services.create_account(account)
29
- #
30
- module KingSoa
31
-
32
- class << self
33
-
34
- def init_from_hash(services)
35
- # create service
36
-
37
- end
38
-
39
- # Locate service by a given name
40
- # ==== Params
41
- # service<String|Symbol>:: the name to lookup
42
- def find(service)
43
- Registry[service]
44
- end
45
-
46
- # this is where the services get called
47
- def method_missing(meth, *args, &blk) # :nodoc:
48
- if service = Registry[meth]
49
- service.execute(*args)
50
- else
51
- super
52
- end
53
- end
54
- end
55
-
56
- end
@@ -1,36 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
-
3
- describe KingSoa::Rack::Middleware do
4
- include Rack::Test::Methods
5
-
6
- before(:each) do
7
- @service = KingSoa::Service.new(:url=>'localhost', :name=>'a_method')
8
- KingSoa::Registry << @service
9
- end
10
-
11
- it "should be able to handle exceptions" do
12
- app = stub("ApplicationStub").as_null_object
13
- middleware = KingSoa::Rack::Middleware.new(app)
14
- env = {"PATH_INFO" => "/soa", "name" => 'a_method'}
15
-
16
- rack_response = middleware.call env
17
- rack_response.first.should == 500 #status code
18
- rack_response.last.should be_a_kind_of(Array)
19
- rack_response.last.first.should == "{\"error\":\"An error occurred! (Missing rack.input)\"}"
20
- end
21
-
22
- xit "says hello" do
23
- app = stub("ApplicationStub").as_null_object
24
- middleware = Hoth::Providers::RackProvider.new(app)
25
-
26
- get '/soa', :name=>'a_method', :params=> "#{{:number=>1}.to_json}"
27
- last_response.should == 'ads'#be_ok
28
- last_response.body.should == 'Hello World'
29
- end
30
-
31
- # def app
32
- # dummy_app = lambda { |env| puts "in dummy"; [200, {}, ""] }
33
- # KingSoa::Rack::Middleware.new(dummy_app)
34
- # end
35
-
36
- end
@@ -1,28 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- describe KingSoa::Registry do
4
- before(:each) do
5
-
6
- end
7
-
8
- it "should return empty services" do
9
- reg = KingSoa::Registry.new
10
- reg.services.should == []
11
- end
12
-
13
- it "should add service" do
14
- reg = KingSoa::Registry.new
15
- s = KingSoa::Service.new(:url=>'http://localhost')
16
- reg << s
17
- reg.services.should == [s]
18
- end
19
-
20
- it "should return a service by name" do
21
- reg = KingSoa::Registry.new
22
- s = KingSoa::Service.new(:name=>:save_document, :url=>'http://localhost')
23
- reg << s
24
- reg[:save_document].should == s
25
- end
26
-
27
-
28
- end