proc 0.6.0 → 0.9.1

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: 1759094e21f61007e2f96393615f5ae03880bff36f6ee764e1072ba7b73bd310
4
- data.tar.gz: 7495016b1b5e9de6e4d8a8c92dce90b4769f6404488d92b69f88ab06238ee6cb
3
+ metadata.gz: cbe8ec8f147808e160d44b09da719dafb03e329b3b1fb78f345300af4c9ab798
4
+ data.tar.gz: f7d81cecd2d9c6cf88e3b4f59bae7681e962bd2dd7d95fd6a1c1593f8245639c
5
5
  SHA512:
6
- metadata.gz: '00008d07672ae0a0aed43d4146b0c6ea687071d939085e19cc7ae82aabc770e33dcb959d53ec69705784c667ffdad75545650e97872870ccd1396285b034149c'
7
- data.tar.gz: b7d89543b58a65bdd9522bf360c2a76132f2a7a391717af3d1f0fb665e49b0157b85081cfcd0ddacb289e82c5cb87036946da10944b16645550e03aa72329a1b
6
+ metadata.gz: e31c9f0c03adc5b2b82f0a2205cfb990f7be7bf529cf287580f2253b70425b63be00f19583838b93e15642f5ea2d3a1289d88065d6658f247f25b875d5bd8e3f
7
+ data.tar.gz: 9f44c4c22a636faa3f3032420a48e8aa8e7b92b18d2023115736612ef1b03736d967b770a43cf28e3ef426057b2ffa31a0398e627b51e271b6612cfadd2d0fea
data/lib/proc.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "proc/client"
4
+ require_relative "proc/version"
4
5
 
5
6
  class Proc
6
7
  def self.connect(authorization, **options)
@@ -8,7 +9,7 @@ class Proc
8
9
  end
9
10
 
10
11
  def self.undefined
11
- @_undefined ||= Object.new
12
+ @_undefined ||= ::Object.new
12
13
  end
13
14
 
14
15
  def self.undefined?(value)
data/lib/proc/callable.rb CHANGED
@@ -16,7 +16,7 @@ class Proc
16
16
  @arguments = arguments.dup
17
17
  end
18
18
 
19
- def call(input = input_omitted = true, **arguments)
19
+ def call(input = input_omitted = true, **arguments, &block)
20
20
  callable = self.class.new(
21
21
  @proc,
22
22
  client: @client,
@@ -24,7 +24,7 @@ class Proc
24
24
  arguments: @arguments.merge(arguments)
25
25
  )
26
26
 
27
- @client.call(@proc, callable.input, **callable.arguments)
27
+ @client.call(@proc, callable.input, **callable.arguments, &block)
28
28
  end
29
29
 
30
30
  def with(input = input_omitted = true, **arguments)
@@ -43,7 +43,7 @@ class Proc
43
43
  composed
44
44
  end
45
45
 
46
- def serialize
46
+ def serialize(unwrapped: false)
47
47
  serialized = ["()", @proc]
48
48
 
49
49
  unless Proc.undefined?(@input)
@@ -52,7 +52,11 @@ class Proc
52
52
 
53
53
  serialized.concat(serialized_arguments)
54
54
 
55
- ["{}", serialized]
55
+ if unwrapped
56
+ serialized
57
+ else
58
+ ["{}", serialized]
59
+ end
56
60
  end
57
61
 
58
62
  def serialized_input
data/lib/proc/client.rb CHANGED
@@ -1,21 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "async"
4
- require "oj"
4
+ require "msgpack"
5
+
6
+ require_relative "msgpack/types/decimal"
7
+ MessagePack::DefaultFactory.register_type(0x00, Proc::Msgpack::Types::Decimal)
8
+ MessagePack::DefaultFactory.register_type(-1, Time, packer: MessagePack::Time::Packer, unpacker: MessagePack::Time::Unpacker)
5
9
 
6
10
  require_relative "argument"
7
11
  require_relative "callable"
8
12
  require_relative "composition"
13
+ require_relative "enumerator"
9
14
 
10
15
  require_relative "http/client"
11
16
 
12
17
  Console.logger.off!
13
18
 
14
- Oj.default_options = {
15
- mode: :custom,
16
- bigdecimal_load: :auto
17
- }.freeze
18
-
19
19
  class Proc
20
20
  class Error < StandardError
21
21
  end
@@ -42,6 +42,8 @@ class Proc
42
42
  end
43
43
 
44
44
  class Client
45
+ attr_reader :authorization, :scheme, :host
46
+
45
47
  def initialize(authorization, scheme: "https", host: "proc.dev")
46
48
  @authorization = authorization
47
49
  @scheme = scheme
@@ -53,28 +55,33 @@ class Proc
53
55
  Callable.new(proc, client: self)
54
56
  end
55
57
 
56
- def remaining
57
- unless defined?(@remaining)
58
- self["ping"].call
59
- end
58
+ def rate_limit
59
+ refresh_rate_limit
60
+ @rate_limit
61
+ end
62
+
63
+ def rate_limit_window
64
+ refresh_rate_limit
65
+ @rate_limit_window
66
+ end
60
67
 
61
- @remaining
68
+ def rate_limit_reset
69
+ refresh_rate_limit
70
+ @rate_limit_reset
62
71
  end
63
72
 
64
- def resets_at
65
- unless defined?(@resets_at)
73
+ private def refresh_rate_limit
74
+ unless defined?(@rate_limit_reset)
66
75
  self["ping"].call
67
76
  end
68
-
69
- @resets_at
70
77
  end
71
78
 
72
79
  DEFAULT_HEADERS = {
73
- "accept" => "application/vnd.proc+json",
74
- "content-type" => "application/vnd.proc+json"
80
+ "accept" => "application/vnd.proc+msgpack",
81
+ "content-type" => "application/vnd.proc+msgpack"
75
82
  }.freeze
76
83
 
77
- def call(proc = nil, input = Proc.undefined, **arguments)
84
+ def call(proc = nil, input = Proc.undefined, **arguments, &block)
78
85
  body = []
79
86
 
80
87
  unless Proc.undefined?(input)
@@ -89,11 +96,30 @@ class Proc
89
96
  "authorization" => "bearer #{@authorization}"
90
97
  }.merge(DEFAULT_HEADERS)
91
98
 
92
- status, payload = get_payload(proc: proc, headers: headers, body: body)
99
+ status, headers, payload = get_payload(proc: proc, headers: headers, body: body)
93
100
 
94
101
  case status
95
102
  when 200
96
- extract_output(payload)
103
+ result = extract_output(payload)
104
+
105
+ if (cursor = headers["x-cursor"])
106
+ enumerator = if cursor.empty?
107
+ Enumerator.new(result)
108
+ else
109
+ Enumerator.new(result) {
110
+ arguments[:cursor] = cursor.to_s
111
+ call(proc, input, **arguments)
112
+ }
113
+ end
114
+
115
+ if block
116
+ enumerator.each(&block)
117
+ else
118
+ enumerator
119
+ end
120
+ else
121
+ result
122
+ end
97
123
  when 400
98
124
  raise Proc::Invalid, extract_error_message(payload)
99
125
  when 401
@@ -153,10 +179,23 @@ class Proc
153
179
  end
154
180
 
155
181
  private def get_payload(proc:, headers:, body:)
156
- @internal.call(:post, build_uri(proc), headers: headers, body: Oj.dump(body)) do |response|
157
- @remaining = response.headers["x-rate-limit-remaining"].to_s.to_i
158
- @resets_at = Time.at(response.headers["x-rate-limit-reset"].to_s.to_i)
159
- [response.status, Oj.load(response.read)]
182
+ @internal.call(:post, build_uri(proc), headers: headers, body: MessagePack.pack(body)) do |response|
183
+ split_limit = response.headers["x-rate-limit"].to_s.split(";window=")
184
+
185
+ @rate_limit = split_limit[0].to_i
186
+
187
+ @rate_limit_window = case split_limit[1]
188
+ when "60"
189
+ :minute
190
+ when "1"
191
+ :second
192
+ end
193
+
194
+ @rate_limit_reset = if (reset = response.headers["x-rate-limit-reset"])
195
+ Time.at(reset.to_s.to_i)
196
+ end
197
+
198
+ [response.status, response.headers, MessagePack.unpack(response.read)]
160
199
  end
161
200
  rescue
162
201
  raise Proc::Unavailable
@@ -15,7 +15,7 @@ class Proc
15
15
  @callables = @callables.dup
16
16
  end
17
17
 
18
- def call(input = input_omitted = true, **arguments)
18
+ def call(input = input_omitted = true, **arguments, &block)
19
19
  callable = self.class.new(
20
20
  client: @client,
21
21
  input: input_omitted ? @input : input,
@@ -23,7 +23,7 @@ class Proc
23
23
  arguments: @arguments.merge(arguments)
24
24
  )
25
25
 
26
- @client.call("exec", Proc.undefined, proc: callable)
26
+ @client.call("exec", Proc.undefined, proc: callable, &block)
27
27
  end
28
28
 
29
29
  def with(input = input_omitted = true, **arguments)
@@ -57,19 +57,7 @@ class Proc
57
57
  serialized << [">>", serialized_input]
58
58
  end
59
59
 
60
- serialized + serialized_arguments + serialized_calls
61
- end
62
-
63
- def serialized_calls
64
- @callables.map { |callable|
65
- serialized = ["()", callable.proc]
66
-
67
- unless Proc.undefined?(callable.input)
68
- serialized << [">>", callable.serialized_input]
69
- end
70
-
71
- serialized.concat(callable.serialized_arguments)
72
- }
60
+ serialized + serialized_arguments + @callables.map { |callable| callable.serialize(unwrapped: true) }
73
61
  end
74
62
 
75
63
  def serialized_input
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Proc
4
+ class Enumerator
5
+ include Enumerable
6
+
7
+ def initialize(values, &next_block)
8
+ @values = values
9
+ @next_block = next_block
10
+ end
11
+
12
+ def each(&block)
13
+ return to_enum(:each) unless block
14
+
15
+ @values.each(&block)
16
+
17
+ if @next_block
18
+ @next_block.call.each(&block)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -3,8 +3,6 @@
3
3
  require "async"
4
4
  require "async/http/internet"
5
5
 
6
- require "protocol/http/body/streamable"
7
-
8
6
  require "core/async"
9
7
 
10
8
  require_relative "request"
@@ -15,30 +13,24 @@ class Proc
15
13
  class Client
16
14
  include Is::Async
17
15
 
18
- def initialize
19
- @internet = Async::HTTP::Internet.new
20
- end
21
-
22
16
  def call(method, uri, params: {}, headers: {}, body: nil)
17
+ internet = Async::HTTP::Internet.new
23
18
  request = Request.new(method: method, uri: uri, params: params, headers: headers, body: body)
24
19
 
25
20
  await {
26
21
  begin
27
- response = make_request(request)
22
+ response = make_request(internet, request)
28
23
 
29
24
  yield response
30
25
  ensure
31
26
  response&.close
27
+ internet&.close
32
28
  end
33
29
  }
34
30
  end
35
31
 
36
- def close
37
- @internet.close
38
- end
39
-
40
- private def make_request(request)
41
- async_response = @internet.call(*request.callable)
32
+ private def make_request(internet, request)
33
+ async_response = internet.call(*request.callable)
42
34
  wrap_async_response_for_request(async_response, request)
43
35
  end
44
36
 
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ class BigDecimal
4
+ def to_msgpack(packer)
5
+ if precision > 16
6
+ packer.write(Proc::Msgpack::Types::Decimal.new(self))
7
+ packer
8
+ else
9
+ to_f.to_msgpack(packer)
10
+ end
11
+ end
12
+ end
13
+
14
+ class Proc
15
+ module Msgpack
16
+ module Types
17
+ class Decimal
18
+ class << self
19
+ def from_msgpack_ext(data)
20
+ BigDecimal(data)
21
+ end
22
+ end
23
+
24
+ def initialize(value)
25
+ @value = value
26
+ end
27
+
28
+ def to_msgpack_ext
29
+ @value.to_s
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
data/lib/proc/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Proc
4
- VERSION = "0.6.0"
4
+ VERSION = "0.9.1"
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.6.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Powell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-10 00:00:00.000000000 Z
11
+ date: 2021-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async-http
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.52.5
19
+ version: 0.54.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.52.5
26
+ version: 0.54.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: core-async
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.0.0
33
+ version: 0.2.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.0.0
40
+ version: 0.2.1
41
41
  - !ruby/object:Gem::Dependency
42
- name: oj
42
+ name: msgpack
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.10'
47
+ version: '1.4'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.10'
54
+ version: '1.4'
55
55
  description: Proc client library.
56
56
  email: bryan@metabahn.com
57
57
  executables: []
@@ -65,9 +65,11 @@ files:
65
65
  - lib/proc/callable.rb
66
66
  - lib/proc/client.rb
67
67
  - lib/proc/composition.rb
68
+ - lib/proc/enumerator.rb
68
69
  - lib/proc/http/client.rb
69
70
  - lib/proc/http/request.rb
70
71
  - lib/proc/http/response.rb
72
+ - lib/proc/msgpack/types/decimal.rb
71
73
  - lib/proc/version.rb
72
74
  homepage: https://proc.dev/
73
75
  licenses:
@@ -88,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
90
  - !ruby/object:Gem::Version
89
91
  version: '0'
90
92
  requirements: []
91
- rubygems_version: 3.1.4
93
+ rubygems_version: 3.2.4
92
94
  signing_key:
93
95
  specification_version: 4
94
96
  summary: Proc client library.