activerpc 0.2.0 → 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
  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