proc 0.0.1 → 0.0.2

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: 9b1cac83c7cff9f09dc94086b6b58e43cf686c4faa28e95aecda09c73e9eebbc
4
- data.tar.gz: e349377c73af33cdff5dfb488dbfd199ec37b9c1db84132e82dde7d65889b71b
3
+ metadata.gz: 59becc885513c542ccee8100b436c2854d5c42939b72424a691a281741861728
4
+ data.tar.gz: 82cfac2a503a9e934efeae9b41d037b6dd72d1e78e493a6ec921d04a39fec97e
5
5
  SHA512:
6
- metadata.gz: e9b7322deb5945ddac4cff0c12c444d8c90d88b917619176bc2983370e215f54ebafdf83e82a4778424fc94a9ed67149596ebb7fd7378d0bea8d0fcdac611a67
7
- data.tar.gz: 91286717d2ee7d67a8021f3aedf2debec4c2da88e2f9abbe34dadd751f02c64f227a40dbdb8e3f6b95ed0ca5ead33557b096683594b3b5e32f10aab5eaf23367
6
+ metadata.gz: 71cbb386c7e906584a706538f3cccba04a7090496486b80160b2856b2d4dbe480d35b02f83814643fb208173518053f283b9d4e2c365f8164781e569b23f98ea
7
+ data.tar.gz: '095adc172bb26b52871a0fb9d8265fb782cab0ae43981c03f1bedfe47200cdf1551e78cf1564e29ade46a535f0c717350e306513583b4ced7e09eac815a10c73'
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # TODO: Introduce inspectable everywhere (just bundle from pakyow).
4
-
5
3
  require_relative "proc/client"
6
4
 
7
5
  class Proc
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "async"
3
4
  require "oj"
4
5
 
5
6
  require_relative "callable"
6
7
  require_relative "composition"
8
+ require_relative "null_logger"
7
9
 
8
10
  require_relative "http/client"
9
11
 
@@ -45,36 +47,38 @@ class Proc
45
47
  }.freeze
46
48
 
47
49
  def perform(proc, input, **arguments)
48
- body = {
49
- input: input, arguments: arguments
50
- }
51
-
52
- headers = {
53
- "authorization" => "Bearer #{@authorization}"
54
- }.merge(DEFAULT_HEADERS)
55
-
56
- begin
57
- response = call(:post, build_uri(proc), headers: headers, body: Oj.dump(body, mode: :json))
58
- rescue => error
59
- raise Proc::Unavailable, error.message
60
- end
61
-
62
- payload = if response.body
63
- Oj.load(response.body.read, mode: :strict)
64
- end
65
-
66
- case response.status
67
- when 200
68
- payload["value"]
69
- when 400
70
- raise Proc::ArgumentError, payload.dig("error", "message")
71
- when 403
72
- raise Proc::Unauthorized, payload.dig("error", "message")
73
- when 404
74
- raise Proc::Undefined, payload.dig("error", "message")
75
- when 500
76
- raise Proc::Error, payload.dig("error", "message")
77
- end
50
+ Async(logger: NullLogger) { |task|
51
+ body = {
52
+ input: input, arguments: arguments
53
+ }
54
+
55
+ headers = {
56
+ "authorization" => "Bearer #{@authorization}"
57
+ }.merge(DEFAULT_HEADERS)
58
+
59
+ begin
60
+ response = call(:post, build_uri(proc), headers: headers, body: Oj.dump(body, mode: :json), task: task)
61
+
62
+ payload = Oj.load(response.read, mode: :strict)
63
+ rescue => error
64
+ raise Proc::Unavailable, error.message
65
+ ensure
66
+ response&.close
67
+ end
68
+
69
+ case response.status
70
+ when 200
71
+ payload["value"]
72
+ when 400
73
+ raise Proc::ArgumentError, payload.dig("error", "message")
74
+ when 403
75
+ raise Proc::Unauthorized, payload.dig("error", "message")
76
+ when 404
77
+ raise Proc::Undefined, payload.dig("error", "message")
78
+ when 500
79
+ raise Proc::Error, payload.dig("error", "message")
80
+ end
81
+ }.wait
78
82
  end
79
83
 
80
84
  private def build_uri(proc)
@@ -8,35 +8,31 @@ require "protocol/http/body/streamable"
8
8
  require_relative "request"
9
9
  require_relative "response"
10
10
 
11
+ require_relative "../null_logger"
12
+
11
13
  class Proc
12
14
  module Http
13
15
  class Client
14
- class NullLogger
15
- class << self
16
- def method_missing(*, **)
17
- end
18
-
19
- def respond_to_missing?(*)
20
- true
21
- end
22
- end
23
- end
24
-
25
16
  def initialize
26
17
  @internet = Async::HTTP::Internet.new
27
18
  @responses = {}
28
19
  end
29
20
 
30
- def call(method, uri, params: {}, headers: {}, body: nil)
21
+ def call(method, uri, params: {}, headers: {}, body: nil, task: nil)
31
22
  request = Request.new(method: method, uri: uri, params: params, headers: headers, body: body)
32
23
 
33
- Async(logger: NullLogger) {
34
- async_request = @internet.call(*request.callable)
35
- wrap_async_response_for_request(async_request, request)
36
- }.wait
24
+ if task
25
+ make_request(request)
26
+ else
27
+ Async(logger: NullLogger) {
28
+ make_request(request)
29
+ }.wait
30
+ end
37
31
  end
38
32
 
39
33
  def close
34
+ # TODO: Make sure this works. We should also close / clear after accumulating some amount.
35
+ #
40
36
  @responses.each_value(&:close)
41
37
  @responses.clear
42
38
  @internet.close
@@ -46,20 +42,13 @@ class Proc
46
42
  @responses.count
47
43
  end
48
44
 
49
- private def wrap_async_response_for_request(async_response, request)
50
- Protocol::HTTP::Body::Streamable.wrap(async_response) do
51
- @responses.delete(async_response)
52
- end
53
-
54
- response = Response.new(
55
- request: request,
56
- status: async_response.status,
57
- version: async_response.version,
58
- headers: async_response.headers,
59
- body: async_response.body
60
- )
45
+ private def make_request(request)
46
+ async_response = @internet.call(*request.callable)
47
+ wrap_async_response_for_request(async_response, request)
48
+ end
61
49
 
62
- @responses[async_response] = response
50
+ private def wrap_async_response_for_request(async_response, request)
51
+ @responses[async_response] = Response.new(request, async_response)
63
52
  end
64
53
  end
65
54
  end
@@ -1,37 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "forwardable"
4
+
3
5
  class Proc
4
6
  module Http
5
7
  class Response
6
- attr_reader :request, :status, :version, :headers, :body
7
-
8
- def initialize(request:, status:, version:, headers:, body:)
9
- @request = request
10
- @status = status
11
- @version = version
12
- @headers = headers
13
- @body = body
14
-
15
- @stream = nil
16
- @stream_blocks = []
17
- end
18
-
19
- def stream(&block)
20
- @stream_blocks << block
8
+ extend Forwardable
9
+ def_delegators :@response, :status, :version, :headers, :read, :close
21
10
 
22
- @stream ||= Async {
23
- @body.each do |chunk|
24
- @stream_blocks.each do |stream_callback|
25
- stream_callback.call(chunk)
26
- end
27
- end
28
- }
29
- end
11
+ attr_reader :request
30
12
 
31
- def close
32
- @stream&.stop
33
- @stream_blocks.clear
34
- @body.close
13
+ def initialize(request, response)
14
+ @request = request
15
+ @response = response
35
16
  end
36
17
  end
37
18
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Proc
4
+ class NullLogger
5
+ class << self
6
+ def method_missing(*, **)
7
+ end
8
+
9
+ def respond_to_missing?(*)
10
+ true
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Proc
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.2"
5
5
 
6
6
  def self.version
7
7
  VERSION
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Powell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-20 00:00:00.000000000 Z
11
+ date: 2020-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async-http
@@ -55,6 +55,7 @@ files:
55
55
  - lib/proc/http/client.rb
56
56
  - lib/proc/http/request.rb
57
57
  - lib/proc/http/response.rb
58
+ - lib/proc/null_logger.rb
58
59
  - lib/proc/version.rb
59
60
  homepage: https://proc.dev/
60
61
  licenses: