sk-hoth 0.0.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.
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