fauna 2.3.0 → 2.4.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 +4 -4
- data/CHANGELOG +6 -0
- data/lib/fauna/client.rb +1 -7
- data/lib/fauna/errors.rb +10 -3
- data/lib/fauna/json.rb +2 -0
- data/lib/fauna/objects.rb +32 -0
- data/lib/fauna/query.rb +32 -0
- data/lib/fauna/version.rb +1 -1
- data/spec/errors_spec.rb +15 -0
- data/spec/json_spec.rb +14 -0
- data/spec/query_spec.rb +61 -1
- data/spec/queryv_spec.rb +25 -0
- metadata +13 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aeba4b71fb3aa58412e5f78514faa422f3d71eab
|
4
|
+
data.tar.gz: 0a53bd599a46461131c1c552b7ef6e1893833cd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f4b77c6451c409b30135a918ddacd7bc6751658d9ddb4c38733b8503032be6c148a0cf9e78b105259e444150b68a0a0054b909fac48ce977c2386136afaf9d4
|
7
|
+
data.tar.gz: 524c60bcada18bc69e7411cac1fbc17afc58624aaa448763bf38f467b43edd4063f5a5d0eed6b0c9ba834fb4f5bb3d452725dbd4e83c300489cf49ad45182317
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
2.4.0
|
2
|
+
* Handle HTTP errors 502 and 504 as `Fauna::UnavailableError`.
|
3
|
+
* Added support for user-defined functions.
|
4
|
+
* Added support for the `@query` type (via `Fauna::QueryV`).
|
5
|
+
* Added `create_function`, `function`, and `call` query functions.
|
6
|
+
|
1
7
|
2.3.0
|
2
8
|
* Change default domain to `db.fauna.com`.
|
3
9
|
* Added `key_from_secret` and `at` query functions.
|
data/lib/fauna/client.rb
CHANGED
@@ -215,9 +215,7 @@ module Fauna
|
|
215
215
|
end_time = Time.now
|
216
216
|
|
217
217
|
message = e.class.name
|
218
|
-
unless e.message.nil?
|
219
|
-
message += ": #{e.message}"
|
220
|
-
end
|
218
|
+
message += ": #{e.message}" unless e.message.nil?
|
221
219
|
|
222
220
|
request_result = RequestResult.new(self,
|
223
221
|
action, path, query, data,
|
@@ -238,10 +236,6 @@ module Fauna
|
|
238
236
|
|
239
237
|
@observer.call(request_result) unless @observer.nil?
|
240
238
|
|
241
|
-
if response_json.nil? && response.status != 503
|
242
|
-
fail UnexpectedError.new('Invalid JSON.', request_result)
|
243
|
-
end
|
244
|
-
|
245
239
|
FaunaError.raise_for_status_code(request_result)
|
246
240
|
UnexpectedError.get_or_raise request_result, response_content, :resource
|
247
241
|
end
|
data/lib/fauna/errors.rb
CHANGED
@@ -48,8 +48,12 @@ module Fauna
|
|
48
48
|
fail MethodNotAllowed.new(request_result)
|
49
49
|
when 500
|
50
50
|
fail InternalError.new(request_result)
|
51
|
+
when 502
|
52
|
+
fail UnavailableError.new(request_result)
|
51
53
|
when 503
|
52
54
|
fail UnavailableError.new(request_result)
|
55
|
+
when 504
|
56
|
+
fail UnavailableError.new(request_result)
|
53
57
|
else
|
54
58
|
fail UnexpectedError.new('Unexpected status code.', request_result)
|
55
59
|
end
|
@@ -63,6 +67,10 @@ module Fauna
|
|
63
67
|
@request_result = request_result
|
64
68
|
|
65
69
|
begin
|
70
|
+
if request_result.response_content.nil?
|
71
|
+
fail UnexpectedError.new('Invalid JSON.', request_result)
|
72
|
+
end
|
73
|
+
|
66
74
|
errors_raw = UnexpectedError.get_or_raise request_result, request_result.response_content, :errors
|
67
75
|
@errors = catch :invalid_response do
|
68
76
|
throw :invalid_response unless errors_raw.is_a? Array
|
@@ -89,7 +97,7 @@ module Fauna
|
|
89
97
|
msg
|
90
98
|
end.join(' ')
|
91
99
|
rescue UnexpectedError => e
|
92
|
-
|
100
|
+
unless self.is_a?(UnavailableError) && [502, 503, 504].include?(request_result.status_code)
|
93
101
|
raise e
|
94
102
|
end
|
95
103
|
|
@@ -126,8 +134,7 @@ module Fauna
|
|
126
134
|
# failure within the database.
|
127
135
|
class InternalError < FaunaError; end
|
128
136
|
|
129
|
-
|
130
|
-
# An exception thrown if FaunaDB responds with an HTTP 503.
|
137
|
+
# An exception thrown if FaunaDB responds with an HTTP 502, 503, or 504.
|
131
138
|
class UnavailableError < FaunaError; end
|
132
139
|
|
133
140
|
# Data for one error returned by the server.
|
data/lib/fauna/json.rb
CHANGED
data/lib/fauna/objects.rb
CHANGED
@@ -128,4 +128,36 @@ module Fauna
|
|
128
128
|
new(Base64.urlsafe_decode64(enc))
|
129
129
|
end
|
130
130
|
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# A QueryV.
|
134
|
+
#
|
135
|
+
# Reference: {FaunaDB Special Types}[https://fauna.com/documentation/queries-values-special_types]
|
136
|
+
class QueryV
|
137
|
+
# The raw query hash.
|
138
|
+
attr_accessor :value
|
139
|
+
|
140
|
+
##
|
141
|
+
# Creates a new QueryV with the given parameters.
|
142
|
+
#
|
143
|
+
# +params+:: Hash of parameters to build the QueryV with.
|
144
|
+
#
|
145
|
+
# Reference: {FaunaDB Special Types}[https://fauna.com/documentation/queries-values-special_types]
|
146
|
+
def initialize(params = {})
|
147
|
+
self.value = params
|
148
|
+
end
|
149
|
+
|
150
|
+
# Converts the QueryV to Hash form.
|
151
|
+
def to_hash
|
152
|
+
{ :@query => value }
|
153
|
+
end
|
154
|
+
|
155
|
+
# Returns +true+ if +other+ is a QueryV and contains the same value.
|
156
|
+
def ==(other)
|
157
|
+
return false unless other.is_a? QueryV
|
158
|
+
value == other.value
|
159
|
+
end
|
160
|
+
|
161
|
+
alias_method :eql?, :==
|
162
|
+
end
|
131
163
|
end
|
data/lib/fauna/query.rb
CHANGED
@@ -64,6 +64,14 @@ module Fauna
|
|
64
64
|
Expr.new object: Expr.wrap_values(fields)
|
65
65
|
end
|
66
66
|
|
67
|
+
##
|
68
|
+
# A query expression
|
69
|
+
#
|
70
|
+
# Reference: {FaunaDB Basic Forms}[https://fauna.com/documentation/queries#basic_forms]
|
71
|
+
def query(expr)
|
72
|
+
Expr.new query: Expr.wrap(expr)
|
73
|
+
end
|
74
|
+
|
67
75
|
# :section: Basic forms
|
68
76
|
|
69
77
|
##
|
@@ -174,6 +182,14 @@ module Fauna
|
|
174
182
|
Expr.new lambda: Expr.wrap(var), expr: Expr.wrap(expr)
|
175
183
|
end
|
176
184
|
|
185
|
+
##
|
186
|
+
# A call expression
|
187
|
+
#
|
188
|
+
# Reference: {FaunaDB Basic Forms}[https://fauna.com/documentation/queries#basic_forms]
|
189
|
+
def call(name, *args)
|
190
|
+
Expr.new call: Expr.wrap(name), arguments: Expr.wrap_varargs(args)
|
191
|
+
end
|
192
|
+
|
177
193
|
# :section: Collection Functions
|
178
194
|
|
179
195
|
##
|
@@ -357,6 +373,14 @@ module Fauna
|
|
357
373
|
Expr.new create_key: Expr.wrap(params)
|
358
374
|
end
|
359
375
|
|
376
|
+
##
|
377
|
+
# A create function expression
|
378
|
+
#
|
379
|
+
# Reference: {FaunaDB Write functions}[https://fauna.com/documentation/queries#write_functions]
|
380
|
+
def create_function(params)
|
381
|
+
Expr.new create_function: Expr.wrap(params)
|
382
|
+
end
|
383
|
+
|
360
384
|
# :section: Set Functions
|
361
385
|
|
362
386
|
##
|
@@ -518,6 +542,14 @@ module Fauna
|
|
518
542
|
Expr.new index: Expr.wrap(name)
|
519
543
|
end
|
520
544
|
|
545
|
+
##
|
546
|
+
# A function function
|
547
|
+
#
|
548
|
+
# Reference: {FaunaDB Miscellaneous Functions}[https://fauna.com/documentation#queries-misc_functions]
|
549
|
+
def function(name)
|
550
|
+
Expr.new function: Expr.wrap(name)
|
551
|
+
end
|
552
|
+
|
521
553
|
##
|
522
554
|
# An equals function
|
523
555
|
#
|
data/lib/fauna/version.rb
CHANGED
data/spec/errors_spec.rb
CHANGED
@@ -128,11 +128,26 @@ RSpec.describe 'Fauna Errors' do
|
|
128
128
|
expect { stub_client.get '' }.to raise_fauna_error(Fauna::UnavailableError, 'unavailable')
|
129
129
|
end
|
130
130
|
|
131
|
+
it 'handles upstream 502' do
|
132
|
+
stub_client = stub_get 502, 'Bad gateway'
|
133
|
+
expect { stub_client.get '' }.to raise_error(Fauna::UnavailableError, 'Bad gateway')
|
134
|
+
end
|
135
|
+
|
131
136
|
it 'handles upstream 503' do
|
132
137
|
stub_client = stub_get 503, 'Unable to reach server'
|
133
138
|
expect { stub_client.get '' }.to raise_error(Fauna::UnavailableError, 'Unable to reach server')
|
134
139
|
end
|
135
140
|
|
141
|
+
it 'handles upstream 504' do
|
142
|
+
stub_client = stub_get 504, 'Server timeout'
|
143
|
+
expect { stub_client.get '' }.to raise_error(Fauna::UnavailableError, 'Server timeout')
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'handles upstream json 503' do
|
147
|
+
stub_client = stub_get 503, '{ "error" : "service unavailable" }'
|
148
|
+
expect { stub_client.get '' }.to raise_error(Fauna::UnavailableError, '{ "error" : "service unavailable" }')
|
149
|
+
end
|
150
|
+
|
136
151
|
it 'handles timeout error' do
|
137
152
|
stub_client = stub_error Faraday::TimeoutError.new('timeout')
|
138
153
|
expect { stub_client.get '' }.to raise_error(Fauna::UnavailableError, 'Faraday::TimeoutError: timeout')
|
data/spec/json_spec.rb
CHANGED
@@ -19,6 +19,13 @@ RSpec.describe Fauna::FaunaJson do
|
|
19
19
|
expect(Fauna::FaunaJson.deserialize(data)).to eq(obj)
|
20
20
|
end
|
21
21
|
|
22
|
+
it 'deserializes query' do
|
23
|
+
query = { lambda: 'a', expr: { add: [{ var: 'a' }, 1] } }
|
24
|
+
obj = Fauna::QueryV.new(query)
|
25
|
+
|
26
|
+
expect(Fauna::FaunaJson.deserialize(:@query => query)).to eq(obj)
|
27
|
+
end
|
28
|
+
|
22
29
|
it 'deserializes obj' do
|
23
30
|
obj = { a: random_string, b: random_string }
|
24
31
|
data = { :@obj => obj }
|
@@ -88,6 +95,13 @@ RSpec.describe Fauna::FaunaJson do
|
|
88
95
|
expect(Fauna::FaunaJson.serialize(obj)).to eq(data)
|
89
96
|
end
|
90
97
|
|
98
|
+
it 'serializes query' do
|
99
|
+
query = { lambda: 'a', expr: { add: [{ var: 'a' }, 1] } }
|
100
|
+
obj = Fauna::QueryV.new(query)
|
101
|
+
|
102
|
+
expect(Fauna::FaunaJson.serialize(obj)).to eq(:@query => query)
|
103
|
+
end
|
104
|
+
|
91
105
|
it 'serializes expr' do
|
92
106
|
data = { a: random_string, b: random_number }
|
93
107
|
obj = Fauna::Query::Expr.new(data)
|
data/spec/query_spec.rb
CHANGED
@@ -123,6 +123,13 @@ RSpec.describe Fauna::Query do
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
+
describe '#query' do
|
127
|
+
it 'wraps fields in query' do
|
128
|
+
data = Fauna::Query::Expr.new(lambda: random_string, expr: Fauna::Query::Expr.new(add: Fauna::Query::Expr.wrap([1, 1])))
|
129
|
+
expect(Fauna::Query.query(data).raw).to eq(query: data)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
126
133
|
describe '#at' do
|
127
134
|
it 'performs at for given expression' do
|
128
135
|
instance = create_instance
|
@@ -215,6 +222,38 @@ RSpec.describe Fauna::Query do
|
|
215
222
|
end
|
216
223
|
end
|
217
224
|
|
225
|
+
describe '#call' do
|
226
|
+
it 'performs called function' do
|
227
|
+
test_func = client.query do
|
228
|
+
func_body = lambda do |x|
|
229
|
+
[add(x, 1), add(x, 2), add(x, 3)]
|
230
|
+
end
|
231
|
+
|
232
|
+
create ref('functions'), name: 'call_func_test', body: query(func_body)
|
233
|
+
end
|
234
|
+
|
235
|
+
x = random_number
|
236
|
+
|
237
|
+
expect(client.query { call(test_func[:ref], x) }).to eq([x + 1, x + 2, x + 3])
|
238
|
+
end
|
239
|
+
|
240
|
+
it 'handles multiple arguments' do
|
241
|
+
test_func = client.query do
|
242
|
+
func_body = lambda do |x, y, z|
|
243
|
+
[multiply(x, 2), multiply(y, 3), multiply(z, 4)]
|
244
|
+
end
|
245
|
+
|
246
|
+
create ref('functions'), name: 'call_multiarg_test', body: query(func_body)
|
247
|
+
end
|
248
|
+
|
249
|
+
x = random_number
|
250
|
+
y = random_number
|
251
|
+
z = random_number
|
252
|
+
|
253
|
+
expect(client.query { call(test_func[:ref], x, y, z) }).to eq([x * 2, y * 3, z * 4])
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
218
257
|
describe '#map' do
|
219
258
|
it 'performs map from expression' do
|
220
259
|
input = (1..3).collect { random_number }
|
@@ -458,6 +497,16 @@ RSpec.describe Fauna::Query do
|
|
458
497
|
end
|
459
498
|
end
|
460
499
|
|
500
|
+
describe '#create_function' do
|
501
|
+
it 'creates a function' do
|
502
|
+
# Create a function
|
503
|
+
ref = client.query { create_function(name: random_string, body: query(lambda { |a| add(a, 1) })) }[:ref]
|
504
|
+
|
505
|
+
# Assert it was created
|
506
|
+
expect(client.query { exists(ref) }).to be(true)
|
507
|
+
end
|
508
|
+
end
|
509
|
+
|
461
510
|
describe 'sets' do
|
462
511
|
before do
|
463
512
|
@x_value = random_number
|
@@ -656,7 +705,7 @@ RSpec.describe Fauna::Query do
|
|
656
705
|
end
|
657
706
|
end
|
658
707
|
|
659
|
-
describe '#
|
708
|
+
describe '#class_' do
|
660
709
|
it 'gets an existing class' do
|
661
710
|
# Create a class
|
662
711
|
name = random_string
|
@@ -679,6 +728,17 @@ RSpec.describe Fauna::Query do
|
|
679
728
|
end
|
680
729
|
end
|
681
730
|
|
731
|
+
describe '#function' do
|
732
|
+
it 'gets an existing function' do
|
733
|
+
# Create a function
|
734
|
+
name = random_string
|
735
|
+
ref = client.query { create_function(name: name, body: query(lambda { |a| add(a, 1) })) }[:ref]
|
736
|
+
|
737
|
+
# Get the function ref
|
738
|
+
expect(client.query { function(name) }).to eq(ref)
|
739
|
+
end
|
740
|
+
end
|
741
|
+
|
682
742
|
describe '#equals' do
|
683
743
|
it 'performs equals' do
|
684
744
|
expect(client.query { equals(1, 1, 1) }).to be(true)
|
data/spec/queryv_spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
RSpec.describe Fauna::QueryV do
|
2
|
+
describe '#==' do
|
3
|
+
it 'equals same query' do
|
4
|
+
lambda = Fauna::Query.expr { lambda_expr([:a], add(var(:a), var(:a))) }
|
5
|
+
query = Fauna::QueryV.new(lambda)
|
6
|
+
|
7
|
+
expect(query).to eq(Fauna::QueryV.new(lambda))
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'does not equal different query' do
|
11
|
+
lambda = Fauna::Query.expr { lambda_expr([:a], add(var(:a), var(:a))) }
|
12
|
+
query = Fauna::QueryV.new(lambda)
|
13
|
+
|
14
|
+
other_lambda = Fauna::Query.expr { lambda_expr([:b], multiply(var(:b), var(:b))) }
|
15
|
+
expect(query).not_to eq(Fauna::QueryV.new(other_lambda))
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'does not equal other type' do
|
19
|
+
lambda = Fauna::Query.expr { lambda_expr([:a], add(var(:a), var(:a))) }
|
20
|
+
query = Fauna::QueryV.new(lambda)
|
21
|
+
|
22
|
+
expect(query).not_to eq(lambda)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fauna
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fauna, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- spec/json_spec.rb
|
131
131
|
- spec/page_spec.rb
|
132
132
|
- spec/query_spec.rb
|
133
|
+
- spec/queryv_spec.rb
|
133
134
|
- spec/ref_spec.rb
|
134
135
|
- spec/setref_spec.rb
|
135
136
|
- spec/spec_helper.rb
|
@@ -159,21 +160,22 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
160
|
version: '0'
|
160
161
|
requirements: []
|
161
162
|
rubyforge_project:
|
162
|
-
rubygems_version: 2.
|
163
|
+
rubygems_version: 2.4.5
|
163
164
|
signing_key:
|
164
165
|
specification_version: 4
|
165
166
|
summary: FaunaDB Ruby driver
|
166
167
|
test_files:
|
167
|
-
- spec/
|
168
|
+
- spec/queryv_spec.rb
|
169
|
+
- spec/client_spec.rb
|
170
|
+
- spec/setref_spec.rb
|
171
|
+
- spec/json_spec.rb
|
168
172
|
- spec/context_spec.rb
|
169
173
|
- spec/client_logger_spec.rb
|
170
174
|
- spec/page_spec.rb
|
171
|
-
- spec/
|
172
|
-
- spec/
|
173
|
-
- spec/client_spec.rb
|
174
|
-
- spec/errors_spec.rb
|
175
|
-
- spec/setref_spec.rb
|
175
|
+
- spec/spec_helper.rb
|
176
|
+
- spec/util_spec.rb
|
176
177
|
- spec/ref_spec.rb
|
177
178
|
- spec/bytes_spec.rb
|
178
|
-
- spec/
|
179
|
-
- spec/
|
179
|
+
- spec/errors_spec.rb
|
180
|
+
- spec/query_spec.rb
|
181
|
+
- spec/fauna_helper.rb
|