vvlad-rack_ext_direct 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/example/config.ru ADDED
@@ -0,0 +1,12 @@
1
+ $:<<File.expand_path(File.dirname( __FILE__) + "/../lib/")
2
+ require 'rack'
3
+ require 'rack/ext/direct'
4
+
5
+ # use Rack::Ext::Direct::Remoting,
6
+ # :service_root => "app/services",
7
+ # :remoting_path => /^\/services$/,
8
+ # :report_errors => true
9
+
10
+ use Rack::Ext::Direct::Dispatching ,"app/services", :report_errors => true
11
+
12
+ run Rack::File.new "public"
@@ -1,4 +1,4 @@
1
- require 'activesupport'
1
+ require 'active_support'
2
2
  require 'open-uri'
3
3
  require 'net/http'
4
4
  require 'json'
@@ -8,9 +8,12 @@ module Rack
8
8
  module Direct
9
9
  class Client
10
10
  class_inheritable_accessor :service_url
11
+ class_inheritable_accessor :service_options
11
12
  class <<self
12
- def end_point_url(url)
13
+ def end_point_url(url,options={})
14
+ options.assert_valid_keys :service_name
13
15
  self.service_url= url
16
+ self.service_options = options.to_options
14
17
  end
15
18
 
16
19
  def next_tid
@@ -20,7 +23,7 @@ module Rack
20
23
 
21
24
  def perform_request(id,*params,&block)
22
25
  request = {
23
- :action => self.name.demodulize,
26
+ :action => service_options[:service_name]||name,
24
27
  :method => id,
25
28
  :data => [*params],
26
29
  :type => "rpc",
@@ -28,7 +31,7 @@ module Rack
28
31
  }
29
32
 
30
33
 
31
- url = URI.parse(self.service_url)
34
+ url = URI.parse(service_url)
32
35
  req = Net::HTTP::Post.new(url.path.empty? ? "/" : url.path)
33
36
  req.body = request.to_json
34
37
  req.content_type= "application/json"
@@ -1,16 +1,22 @@
1
1
  require 'json'
2
- require 'activesupport'
2
+ require 'active_support'
3
+
3
4
  module Rack
4
5
  module Ext
5
6
  module Direct
6
- class Remoting
7
-
7
+ class Remoting
8
+
9
+ include ActiveSupport::Dependencies
10
+
8
11
  def initialize(app,options={})
9
12
  @app = app
10
13
  @services_root = ::File.expand_path(options[:service_root])
11
14
  @services = {}
12
15
  @report_errors = options[:report_errors] || false
13
16
  @remoting_path = options[:remoting_path]
17
+ @reloading = ENV["RACK_ENV"] == "development"
18
+ load_paths << @services_root
19
+
14
20
  raise "Services Directory `#{@services_root}' missing." unless ::File.directory? @services_root
15
21
  end
16
22
 
@@ -29,11 +35,16 @@ module Rack
29
35
  return @app.call(env) if service_class.nil?
30
36
 
31
37
  response = begin
32
- Response.new request,service_class.new.send(request.method.to_sym,request.data)
38
+ instance = service_class.new
39
+ response = Response.new request,instance.send(request.method.to_sym,request.data)
40
+ instance = nil
41
+ response
33
42
  rescue => e
34
43
  ResponseException.new request,e
35
44
  end
36
45
 
46
+ remove_unloadable_constants!
47
+
37
48
  [ 200 , {"Content-Type" => "application/json"}, [response.to_json]]
38
49
 
39
50
  end
@@ -56,18 +67,27 @@ module Rack
56
67
  end
57
68
 
58
69
  def service_by_name(service_name)
59
- @services[service_name] ||= try_load_service(service_name)
70
+ try_load_service(service_name)
60
71
  end
61
72
 
62
73
  def try_load_service(service_name)
63
- service_name = service_name.underscore
64
- service_file = "#{@services_root}/#{service_name}_service.rb"
65
- return nil unless ::File.exists? service_file
66
- require service_file
67
- class_object = "#{service_name}_service".classify.constantize
74
+ begin
75
+ if @reloading
76
+ puts "Reloading #{service_name}"
77
+ ActiveSupport::Dependencies.load_file("#{@services_root}/#{service_name.underscore}.rb")
78
+ else
79
+ require "#{@services_root}/#{service_name.underscore}.rb"
80
+ end
81
+ return service_name.constantize
82
+ rescue => e
83
+ puts e
84
+ puts e.backtrace
85
+ end
86
+ nil
68
87
  end
69
88
 
70
89
  end
71
90
  end
72
91
  end
73
- end
92
+ end
93
+
@@ -14,6 +14,7 @@ module Rack::Ext::Direct
14
14
  instance_variable_set("@#{k}",v)
15
15
  end
16
16
  end
17
+ @action.gsub! /\./,'::'
17
18
  end
18
19
  end
19
20
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vvlad-rack_ext_direct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Verestiuc Vlad Ovidiu
@@ -53,6 +53,7 @@ extra_rdoc_files:
53
53
  files:
54
54
  - example/app/services/test_service.rb
55
55
  - example/client.rb
56
+ - example/config.ru
56
57
  - lib/rack/ext/direct/client.rb
57
58
  - lib/rack/ext/direct/dispatching.rb
58
59
  - lib/rack/ext/direct/remote_error.rb