activerpc 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e424564ef40dfcc5c6a1e802a8e7767a7111f5de76ebd52b7f91581f61bae195
4
- data.tar.gz: 2d27258a00946665bd4795f124c3eb63f6ce59ed5056d3b0396c422d611c22e8
3
+ metadata.gz: '08b7d8b162f3cba366564c7571b55a1c1f3b772a6f989edf8e70974b49e2b97f'
4
+ data.tar.gz: 37c2e93c5fdfd169625ed06d53fc027dda638e39c30f5b37dec452607dc27e4d
5
5
  SHA512:
6
- metadata.gz: 1f62f60e31e8ae1e26922693d3666f4f48ebac57f1eaf4a02dc96b9254f8636ae926addf08edef1ee67759c4344510e64d23b3454ac4fdf1a64be1886537898a
7
- data.tar.gz: '040801f682a44861de03fbaa779f5d223c21de825e0581a328d114b22f651c14d92fe523c995a8966a085d2b4402e9e198b08ebfb4469cbcb0cc17a14a9d43bd'
6
+ metadata.gz: '0910eb2988cdff04085a38a805a45587a4fc0e24002d703fdde3a101e41cf16ece5a6149f2bca0f2a96144269d4fa9a2f5b13d78c7a56cd5c509d466556e1eff'
7
+ data.tar.gz: e9cf2a2059e0888a121d9c18007e933905d531be57e47a876a9c69c1fa087cd2cdef14339aa804adfc2da1f729a54688b9ad06c7fdea3a3ce0941815d5192187
data/README.md CHANGED
@@ -25,12 +25,13 @@ Or install it yourself as:
25
25
  $ gem install activerpc
26
26
  ```
27
27
 
28
- Once you've installed the gem, you can add an initializer to configure things
29
- such as controller lifecycle actions.
28
+ The final step is to add a `mount` directive to your
29
+ routes file, like so:
30
30
 
31
31
  ```ruby
32
- ActiveRpc.configure do |config|
33
- config.before_action = MyBeforeAction # something that responds to `.before`
32
+ Rails.application.routes.draw do
33
+ # other routes...
34
+ mount ActiveRpc::Engine => "/rpc"
34
35
  end
35
36
  ```
36
37
 
@@ -94,6 +95,23 @@ ActiveRpc.configure do |config|
94
95
  end
95
96
  ```
96
97
 
98
+ Alternatively, you can use mixins to extend the functionality to get more
99
+ control.
100
+
101
+ ```ruby
102
+ ActiveRpc::RpcController.send(:include, Module.new do
103
+ extend ActiveSupport::Concern
104
+
105
+ included do
106
+ around_action do
107
+ start = Time.now
108
+ yield
109
+ puts "took #{Time.now - start}"
110
+ end
111
+ end
112
+ end)
113
+ ```
114
+
97
115
  #### Development Mode
98
116
  Please note, in development mode you might have issues with the operation classes
99
117
  being autoloaded. The new bootloader in Rails 6 will solve this, but until then you
@@ -1,3 +1,7 @@
1
+ require 'active_model/model'
2
+ require 'active_model/validations'
3
+ require 'active_model/validations/callbacks'
4
+
1
5
  module ActiveRpc
2
6
  class Operation
3
7
  include ActiveModel::Model
@@ -0,0 +1,69 @@
1
+ module ActiveRpc
2
+ class RackServer
3
+ def self.call(env)
4
+ new(Rack::Request.new(env)).call
5
+ end
6
+
7
+ attr_reader :request
8
+
9
+ def initialize(request)
10
+ @request = request
11
+ end
12
+
13
+ def call
14
+ res = nil
15
+ begin
16
+ res = case body
17
+ when Array then body.map(&method(:process_item)).map(&:to_hash)
18
+ when Hash then process_item(body).to_hash
19
+ end
20
+ rescue JSON::ParserError => ex
21
+ res = ActiveRpc::Response.new do |r|
22
+ r.error = Errors::ParseError.new(message: ex.to_s)
23
+ end.to_hash
24
+ end
25
+
26
+ [
27
+ 200,
28
+ {'Content-Type' => 'application/json'},
29
+ [JSON.generate(res)]
30
+ ]
31
+ end
32
+
33
+ private def process_item(item)
34
+ req = ActiveRpc::Request.new(item.slice('id', 'method', 'params'))
35
+ res = ActiveRpc::Response.from_request(req)
36
+ ex = nil
37
+
38
+ begin
39
+ raise TypeError, 'invalid JSON-RPC request' unless req.valid?
40
+
41
+ executor = ActiveRpc.get_executor(req.method)
42
+ raise NoMethodError, "undefined operation `#{req.method}'" unless executor
43
+
44
+ ex = executor.new(req.params)
45
+ raise ArgumentError, 'invalid payload' unless ex.valid?
46
+ res.result = ex.call
47
+ rescue TypeError => e
48
+ res.error = Errors::ClientError.new(message: e.to_s)
49
+ res.error.data = req.errors
50
+ rescue NoMethodError => e
51
+ res.error = Errors::NoMethodError.new(message: e.to_s)
52
+ rescue ArgumentError => e
53
+ res.error = Errors::ArgumentError.new(message: e.to_s)
54
+ res.error.data = ex.errors
55
+ rescue OperationFailure => e
56
+ res.error = e.rpc_error
57
+ # todo: handle rpc-level errors
58
+ rescue => e
59
+ res.error = Errors::InternalError.new(message: e.to_s)
60
+ end
61
+
62
+ res
63
+ end
64
+
65
+ private def body
66
+ @body ||= JSON.load(request.body.read)
67
+ end
68
+ end
69
+ end
@@ -1,3 +1,6 @@
1
+ require 'active_model/model'
2
+ require 'active_model/validations'
3
+
1
4
  module ActiveRpc
2
5
  class Request
3
6
  include ActiveModel::Model
@@ -1,3 +1,3 @@
1
1
  module ActiveRpc
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
data/lib/active_rpc.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'active_rpc/engine'
1
+ require 'active_rpc/engine' if defined?(Rails)
2
2
  require 'active_rpc/errors'
3
3
  require 'active_rpc/configuration'
4
4
  require 'active_rpc/operation'
data/lib/activerpc.rb CHANGED
@@ -1 +1 @@
1
- require "active_rpc"
1
+ require 'active_rpc'
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Maxwell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-10 00:00:00.000000000 Z
11
+ date: 2019-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '4.2'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7.0'
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: rails
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -20,7 +40,7 @@ dependencies:
20
40
  - - "<"
21
41
  - !ruby/object:Gem::Version
22
42
  version: '7.0'
23
- type: :runtime
43
+ type: :development
24
44
  prerelease: false
25
45
  version_requirements: !ruby/object:Gem::Requirement
26
46
  requirements:
@@ -67,6 +87,7 @@ files:
67
87
  - lib/active_rpc/engine.rb
68
88
  - lib/active_rpc/errors.rb
69
89
  - lib/active_rpc/operation.rb
90
+ - lib/active_rpc/rack_server.rb
70
91
  - lib/active_rpc/request.rb
71
92
  - lib/active_rpc/response.rb
72
93
  - lib/active_rpc/version.rb
@@ -90,8 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
111
  - !ruby/object:Gem::Version
91
112
  version: '0'
92
113
  requirements: []
93
- rubyforge_project:
94
- rubygems_version: 2.7.6
114
+ rubygems_version: 3.0.1
95
115
  signing_key:
96
116
  specification_version: 4
97
117
  summary: JSONRpc 2.0 Server library for Rails