fauna 1.3.4 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/CHANGELOG +2 -0
- data/Gemfile +1 -1
- data/LICENSE +1 -1
- data/README.md +65 -102
- data/Rakefile +12 -20
- data/fauna.gemspec +19 -44
- data/lib/fauna.rb +12 -14
- data/lib/fauna/client.rb +225 -27
- data/lib/fauna/client_logger.rb +52 -0
- data/lib/fauna/context.rb +135 -0
- data/lib/fauna/errors.rb +181 -0
- data/lib/fauna/json.rb +60 -0
- data/lib/fauna/objects.rb +96 -0
- data/lib/fauna/query.rb +601 -0
- data/lib/fauna/request_result.rb +58 -0
- data/lib/fauna/util.rb +41 -0
- data/lib/fauna/version.rb +4 -0
- data/spec/client_logger_spec.rb +73 -0
- data/spec/client_spec.rb +202 -0
- data/spec/context_spec.rb +121 -0
- data/spec/errors_spec.rb +144 -0
- data/spec/fauna_helper.rb +87 -0
- data/spec/json_spec.rb +123 -0
- data/spec/query_spec.rb +675 -0
- data/spec/ref_spec.rb +77 -0
- data/spec/setref_spec.rb +23 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/util_spec.rb +19 -0
- metadata +65 -83
- data/Manifest +0 -25
- data/lib/fauna/cache.rb +0 -64
- data/lib/fauna/connection.rb +0 -152
- data/lib/fauna/named_resource.rb +0 -17
- data/lib/fauna/rails.rb +0 -120
- data/lib/fauna/resource.rb +0 -175
- data/lib/fauna/set.rb +0 -240
- data/lib/tasks/fauna.rake +0 -71
- data/test/class_test.rb +0 -65
- data/test/client_test.rb +0 -63
- data/test/connection_test.rb +0 -66
- data/test/database_test.rb +0 -48
- data/test/query_test.rb +0 -48
- data/test/readme_test.rb +0 -30
- data/test/set_test.rb +0 -71
- data/test/test_helper.rb +0 -86
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NTQyNTE5MTdlOGY2YWZmMTFiNTQyYTE4OWZiZDA1YTU3NjYyYzk4NA==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9179efc5b2e53c99b6d398de61902fd963fefea7
|
4
|
+
data.tar.gz: cfbee10e91d3cdfe4baabc212b34cfd1ae348ea9
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
YmM1MGMxOTBhOTNkYWUyNGNkZTJiOTg3YzgxNmUzMWQ0NzU1MWJlZWJkMGI0
|
11
|
-
ZDNjNjM4NDJlNjU0YTQ3MDU5OWVlMDU1Mzc3NGY5Y2IyN2MyZGU=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NDlkYzBmNGY5NWU2YmRiODA0YTE1NGNiZWUyMTgxMjAwYWJlNjNmOWFhZTJm
|
14
|
-
OThlY2JiNjA0YzY0ZTY5OGYzN2M2NWJkNDNjYWZiZDNlNTQ1ZDgyZDZmNzNh
|
15
|
-
NTc1NTMyZDRjMTBmYzk4MDJlYTIzZDllMDg1ZWVlNzI0ZjY0ZWI=
|
6
|
+
metadata.gz: c143182304816bde8ed2b057cfd9e0c0a267e382e810c7c651139d7efcfe2aedee343fdae75c76816a4dfe90a775d6cdf921f295cc94f7c7241038fa06ed2587
|
7
|
+
data.tar.gz: 534a5305cacdc340f870f975435c8a69cd0aa3647ddfbf4324226d3171f3ab0f16f1280e96e4551fc1cde9b6ee01691933a016f122be7ec25ecc658c802ae150
|
data/CHANGELOG
CHANGED
data/Gemfile
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
#
|
1
|
+
# FaunaDB
|
2
2
|
|
3
|
-
|
3
|
+
Ruby client for [FaunaDB](https://faunadb.com).
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
The
|
7
|
+
The FaunaDB ruby client is distributed as a gem. Install it via:
|
8
8
|
|
9
9
|
$ gem install fauna
|
10
10
|
|
@@ -18,145 +18,108 @@ And then execute:
|
|
18
18
|
|
19
19
|
## Compatibility
|
20
20
|
|
21
|
-
Tested and compatible with
|
21
|
+
Tested and compatible with the following ruby versions:
|
22
|
+
|
23
|
+
* MRI 1.9.3
|
24
|
+
* MRI 2.2.3
|
25
|
+
* Jruby 1.7.19
|
22
26
|
|
23
27
|
## Basic Usage
|
24
28
|
|
25
29
|
First, require the gem:
|
26
30
|
|
27
31
|
```ruby
|
28
|
-
require
|
29
|
-
require "fauna"
|
32
|
+
require 'fauna'
|
30
33
|
```
|
31
34
|
|
32
|
-
###
|
33
|
-
|
34
|
-
All API requests start with an instance of `Fauna::Connection`.
|
35
|
+
### Creating a Client
|
35
36
|
|
36
|
-
|
37
|
-
client key.
|
37
|
+
All API requests pass through a `Fauna::Client`. Creating a client
|
38
|
+
requires either an admin key, server key, client key, or a token.
|
38
39
|
|
39
40
|
```ruby
|
40
41
|
server_key = 'ls8AkXLdakAAAALPAJFy3LvQAAGwDRAS_Prjy6O8VQBfQAlZzwAA'
|
41
42
|
```
|
42
|
-
Now we can make a global database-level connection:
|
43
|
-
|
44
|
-
```ruby
|
45
|
-
$fauna = Fauna::Connection.new(secret: server_key)
|
46
|
-
```
|
47
43
|
|
48
|
-
|
49
|
-
debugging:
|
44
|
+
Now we can make a database-level client:
|
50
45
|
|
51
46
|
```ruby
|
52
|
-
|
53
|
-
$fauna = Fauna::Connection.new(
|
54
|
-
secret: server_key,
|
55
|
-
logger: Logger.new(STDERR))
|
47
|
+
$fauna = Fauna::Client.new(secret: server_key)
|
56
48
|
```
|
57
49
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
context*, and then manipulate resources within that context:
|
50
|
+
You can optionally configure an `observer` on the client. To ease
|
51
|
+
debugging, we provide a simple logging observer at
|
52
|
+
`Fauna::ClientLogger.logger`, which you can configure as such:
|
62
53
|
|
63
54
|
```ruby
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
user.data["profession"] = "Pigkeeper"
|
68
|
-
user.save
|
69
|
-
user.delete
|
70
|
-
end
|
71
|
-
```
|
55
|
+
require 'logger'
|
56
|
+
logger = Logger.new(STDERR)
|
57
|
+
observer = Fauna::ClientLogger.logger { |log| logger.debug(log) }
|
72
58
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
Within a context block, requests for a resource that has already been
|
78
|
-
loaded via a previous request will be returned from the cache and no
|
79
|
-
query will be issued. This substantially lowers network overhead,
|
80
|
-
since Fauna makes an effort to return related resources as part of
|
81
|
-
every response.
|
59
|
+
$fauna = Fauna::Client.new(
|
60
|
+
secret: server_key,
|
61
|
+
observer: observer)
|
62
|
+
```
|
82
63
|
|
83
|
-
###
|
64
|
+
### Using the Client
|
84
65
|
|
85
|
-
|
86
|
-
fields:
|
66
|
+
Now that we have a client, we can start performing queries:
|
87
67
|
|
88
68
|
```ruby
|
89
|
-
|
90
|
-
|
69
|
+
# Create a class
|
70
|
+
$fauna.query { create ref('classes'), name: 'users' }
|
91
71
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
user.deleted? # => false
|
96
|
-
user.constraints # => {"username" => "taran77"}
|
97
|
-
|
98
|
-
# data and references
|
99
|
-
user.data # => {}
|
100
|
-
user.references # => {}
|
101
|
-
|
102
|
-
# resource events timeline
|
103
|
-
user.events
|
72
|
+
# Create an instance of the class
|
73
|
+
taran = $fauna.query do
|
74
|
+
create ref('classes/users'), data: { email: 'taran@example.com' }
|
104
75
|
end
|
105
|
-
```
|
106
76
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
# and later...
|
116
|
-
|
117
|
-
pig = Fauna::Resource.find 'classes/pigs/42471470493859841'
|
118
|
-
# do something with this pig...
|
119
|
-
````
|
120
|
-
|
121
|
-
## Rails Usage
|
122
|
-
|
123
|
-
Fauna provides a Rails helper that sets up a default context in
|
124
|
-
controllers, based on credentials in `config/fauna.yml`:
|
125
|
-
|
126
|
-
```yaml
|
127
|
-
development:
|
128
|
-
email: taran@example.com
|
129
|
-
password: secret
|
130
|
-
secret: secret_key
|
131
|
-
test:
|
132
|
-
email: taran@example.com
|
133
|
-
password: secret
|
134
|
-
```
|
77
|
+
# Update the instance
|
78
|
+
taran = $fauna.query do
|
79
|
+
update taran[:ref], data: {
|
80
|
+
name: 'Taran',
|
81
|
+
profession: 'Pigkeeper'
|
82
|
+
}
|
83
|
+
end
|
135
84
|
|
136
|
-
|
137
|
-
|
138
|
-
|
85
|
+
# Page through a set
|
86
|
+
pigkeepers = Fauna::Query.expr { match(ref('indexes/users_by_profession'), 'Pigkeeper') }
|
87
|
+
oracles = Fauna::Query.expr { match(ref('indexes/users_by_profession'), 'Oracle') }
|
139
88
|
|
140
|
-
|
89
|
+
$fauna.query { paginate(union(pigkeepers, oracles)) }
|
141
90
|
|
142
|
-
|
143
|
-
|
91
|
+
# Delete the user
|
92
|
+
$fauna.query { delete user[:ref] }
|
144
93
|
```
|
145
94
|
|
146
95
|
## Running Tests
|
147
96
|
|
148
|
-
You can run tests against
|
97
|
+
You can run tests against FaunaDB Cloud yourself.
|
98
|
+
[Create an admin key](https://faunadb.com/account/keys) and set
|
99
|
+
`FAUNA_ROOT_KEY` environment variable to it's secret. Then run `rake test`:
|
149
100
|
|
150
101
|
```bash
|
151
|
-
export FAUNA_ROOT_KEY=
|
152
|
-
rake
|
102
|
+
export FAUNA_ROOT_KEY='kqnPAbijGhkgAAC03-36hjCvcTnWf4Pl8w97UE1HeWo'
|
103
|
+
rake test
|
153
104
|
```
|
154
105
|
|
106
|
+
To run a single test, use e.g. `ruby test/client_test.rb`.
|
107
|
+
|
108
|
+
Coverage is automatically run as part of the tests. After running tests, check
|
109
|
+
`coverage/index.html` for the coverage report. If using jruby, use
|
110
|
+
`JRUBY_OPTS="--debug" bundle exec rake test` to ensure coverage is generated
|
111
|
+
correctly.
|
112
|
+
|
113
|
+
## Documenting
|
114
|
+
|
115
|
+
Use `rake rdoc` to generate documentation.
|
116
|
+
|
155
117
|
## Further Reading
|
156
118
|
|
157
|
-
Please see the
|
158
|
-
or look in
|
159
|
-
for more
|
119
|
+
Please see the [FaunaDB Documentation](https://faunadb.com/documentation) for
|
120
|
+
a complete API reference, or look in
|
121
|
+
[`/test`](https://github.com/faunadb/faunadb-ruby/tree/master/test) for more
|
122
|
+
examples.
|
160
123
|
|
161
124
|
## Contributing
|
162
125
|
|
@@ -164,7 +127,7 @@ GitHub pull requests are very welcome.
|
|
164
127
|
|
165
128
|
## LICENSE
|
166
129
|
|
167
|
-
Copyright
|
130
|
+
Copyright 2016 [Fauna, Inc.](https://faunadb.com/)
|
168
131
|
|
169
132
|
Licensed under the Mozilla Public License, Version 2.0 (the
|
170
133
|
"License"); you may not use this software except in compliance with
|
data/Rakefile
CHANGED
@@ -1,22 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
Echoe.new('fauna') do |p|
|
4
|
-
p.author = 'Fauna, Inc.'
|
5
|
-
p.project = 'fauna'
|
6
|
-
p.summary = 'Ruby client for the Fauna distributed database.'
|
7
|
-
p.retain_gemspec = true
|
8
|
-
p.licenses = ['Mozilla Public License, Version 2.0 (MPL2)']
|
9
|
-
p.dependencies = ['faraday ~>0.9.0', 'json ~>1.8.0']
|
10
|
-
p.development_dependencies = ['mocha', 'echoe', 'minitest ~>4.0', 'rubocop']
|
11
|
-
end
|
12
|
-
|
13
|
-
task :beautify do
|
14
|
-
require 'ruby-beautify'
|
15
|
-
Dir['**/*rb'].each do |filename|
|
16
|
-
s = RBeautify.beautify_string(:ruby, File.read(filename))
|
17
|
-
File.write(filename, s) unless s.empty?
|
18
|
-
end
|
19
|
-
end
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
require 'rdoc/task'
|
20
3
|
|
21
4
|
begin
|
22
5
|
require 'rubocop/rake_task'
|
@@ -27,4 +10,13 @@ rescue LoadError
|
|
27
10
|
end
|
28
11
|
end
|
29
12
|
|
30
|
-
|
13
|
+
RSpec::Core::RakeTask.new(:spec)
|
14
|
+
|
15
|
+
RDoc::Task.new do |rdoc|
|
16
|
+
rdoc.main = 'README.md'
|
17
|
+
rdoc.rdoc_dir = 'doc'
|
18
|
+
rdoc.rdoc_files.include('README.md', 'lib/fauna.rb', 'lib/fauna/*.rb')
|
19
|
+
end
|
20
|
+
|
21
|
+
task prerelease: [:spec, :install]
|
22
|
+
task default: :spec
|
data/fauna.gemspec
CHANGED
@@ -1,50 +1,25 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
2
|
+
require './lib/fauna/version'
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
|
-
s.name =
|
6
|
-
s.version =
|
5
|
+
s.name = 'fauna'
|
6
|
+
s.version = Fauna::VERSION
|
7
|
+
s.author = 'Fauna, Inc.'
|
8
|
+
s.email = 'priority@faunadb.com'
|
9
|
+
s.summary = 'FaunaDB Ruby client'
|
10
|
+
s.description = 'Ruby client for the Fauna distributed database.'
|
11
|
+
s.homepage = 'https://github.com/faunadb/faunadb-ruby'
|
12
|
+
s.license = 'MPL-2.0'
|
7
13
|
|
8
|
-
s.
|
9
|
-
s.
|
10
|
-
s.
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.md", "lib/fauna.rb", "lib/fauna/cache.rb", "lib/fauna/client.rb", "lib/fauna/connection.rb", "lib/fauna/named_resource.rb", "lib/fauna/rails.rb", "lib/fauna/resource.rb", "lib/fauna/set.rb", "lib/fauna/util.rb", "lib/tasks/fauna.rake"]
|
14
|
-
s.files = ["CHANGELOG", "Gemfile", "LICENSE", "Manifest", "README.md", "Rakefile", "fauna.gemspec", "lib/fauna.rb", "lib/fauna/cache.rb", "lib/fauna/client.rb", "lib/fauna/connection.rb", "lib/fauna/named_resource.rb", "lib/fauna/rails.rb", "lib/fauna/resource.rb", "lib/fauna/set.rb", "lib/fauna/util.rb", "lib/tasks/fauna.rake", "test/class_test.rb", "test/client_test.rb", "test/connection_test.rb", "test/database_test.rb", "test/query_test.rb", "test/readme_test.rb", "test/set_test.rb", "test/test_helper.rb"]
|
15
|
-
s.homepage = "http://fauna.github.com/fauna/"
|
16
|
-
s.licenses = ["Mozilla Public License, Version 2.0 (MPL2)"]
|
17
|
-
s.rdoc_options = ["--line-numbers", "--title", "Fauna", "--main", "README.md"]
|
18
|
-
s.require_paths = ["lib"]
|
19
|
-
s.rubyforge_project = "fauna"
|
20
|
-
s.rubygems_version = "2.1.10"
|
21
|
-
s.summary = "Ruby client for the Fauna distributed database."
|
22
|
-
s.test_files = ["test/class_test.rb", "test/client_test.rb", "test/connection_test.rb", "test/database_test.rb", "test/query_test.rb", "test/readme_test.rb", "test/set_test.rb", "test/test_helper.rb"]
|
14
|
+
s.files = %w(CHANGELOG Gemfile LICENSE README.md Rakefile fauna.gemspec lib/fauna.rb) + Dir.glob('lib/fauna/**') + Dir.glob('spec/**')
|
15
|
+
s.extra_rdoc_files = %w(CHANGELOG LICENSE README.md)
|
16
|
+
s.rdoc_options = %w(--line-numbers --title Fauna --main README.md)
|
17
|
+
s.test_files = Dir.glob('spec/**')
|
18
|
+
s.require_paths = ['lib']
|
23
19
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
s.add_runtime_dependency(%q<json>, ["~> 1.8.0"])
|
30
|
-
s.add_development_dependency(%q<mocha>, [">= 0"])
|
31
|
-
s.add_development_dependency(%q<echoe>, [">= 0"])
|
32
|
-
s.add_development_dependency(%q<minitest>, ["~> 4.0"])
|
33
|
-
s.add_development_dependency(%q<rubocop>, [">= 0"])
|
34
|
-
else
|
35
|
-
s.add_dependency(%q<faraday>, ["~> 0.9.0"])
|
36
|
-
s.add_dependency(%q<json>, ["~> 1.8.0"])
|
37
|
-
s.add_dependency(%q<mocha>, [">= 0"])
|
38
|
-
s.add_dependency(%q<echoe>, [">= 0"])
|
39
|
-
s.add_dependency(%q<minitest>, ["~> 4.0"])
|
40
|
-
s.add_dependency(%q<rubocop>, [">= 0"])
|
41
|
-
end
|
42
|
-
else
|
43
|
-
s.add_dependency(%q<faraday>, ["~> 0.9.0"])
|
44
|
-
s.add_dependency(%q<json>, ["~> 1.8.0"])
|
45
|
-
s.add_dependency(%q<mocha>, [">= 0"])
|
46
|
-
s.add_dependency(%q<echoe>, [">= 0"])
|
47
|
-
s.add_dependency(%q<minitest>, ["~> 4.0"])
|
48
|
-
s.add_dependency(%q<rubocop>, [">= 0"])
|
49
|
-
end
|
20
|
+
s.add_runtime_dependency 'faraday', '~> 0.9.0'
|
21
|
+
s.add_runtime_dependency 'json', '~> 1.8'
|
22
|
+
s.add_development_dependency 'rspec', '~> 3.4'
|
23
|
+
s.add_development_dependency 'rubocop', '~> 0.35.0'
|
24
|
+
s.add_development_dependency 'coveralls', '~> 0.8.10'
|
50
25
|
end
|
data/lib/fauna.rb
CHANGED
@@ -4,21 +4,19 @@ require 'uri'
|
|
4
4
|
require 'faraday'
|
5
5
|
require 'cgi'
|
6
6
|
require 'zlib'
|
7
|
+
require 'time'
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
module Fauna
|
11
|
-
class Invalid < RuntimeError
|
12
|
-
end
|
13
|
-
|
14
|
-
class NotFound < RuntimeError
|
15
|
-
end
|
16
|
-
end
|
9
|
+
##
|
10
|
+
# Main namespace for the FaunaDB client.
|
11
|
+
module Fauna; end
|
17
12
|
|
13
|
+
require 'fauna/version'
|
14
|
+
require 'fauna/json'
|
18
15
|
require 'fauna/util'
|
19
|
-
require 'fauna/
|
20
|
-
require 'fauna/cache'
|
16
|
+
require 'fauna/errors'
|
21
17
|
require 'fauna/client'
|
22
|
-
require 'fauna/
|
23
|
-
require 'fauna/
|
24
|
-
require 'fauna/
|
18
|
+
require 'fauna/client_logger'
|
19
|
+
require 'fauna/context'
|
20
|
+
require 'fauna/objects'
|
21
|
+
require 'fauna/query'
|
22
|
+
require 'fauna/request_result'
|
data/lib/fauna/client.rb
CHANGED
@@ -1,54 +1,252 @@
|
|
1
1
|
module Fauna
|
2
|
+
##
|
3
|
+
# The Ruby client for FaunaDB.
|
4
|
+
#
|
5
|
+
# All methods return a converted JSON response.
|
6
|
+
# This is a Hash containing Arrays, ints, floats, strings, and other Hashes.
|
7
|
+
# Hash keys are always Symbols.
|
8
|
+
#
|
9
|
+
# Any Ref, SetRef, Time or Date values in it will also be parsed.
|
10
|
+
# (So instead of <code>{ "@ref": "classes/frogs/123" }</code>,
|
11
|
+
# you will get <code>Fauna::Ref.new("classes/frogs/123")</code>).
|
2
12
|
class Client
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
13
|
+
# The domain requests will be sent to.
|
14
|
+
attr_reader :domain
|
15
|
+
# Scheme used when sending requests (either +http+ or +https+).
|
16
|
+
attr_reader :scheme
|
17
|
+
# Port used when sending requests.
|
18
|
+
attr_reader :port
|
19
|
+
# An array of the user and pass used for authentication when sending requests.
|
20
|
+
attr_reader :credentials
|
21
|
+
# Read timeout in seconds.
|
22
|
+
attr_reader :read_timeout
|
23
|
+
# Open timeout in seconds.
|
24
|
+
attr_reader :connection_timeout
|
25
|
+
# Callback that will be passed a +RequestResult+ after every completed request.
|
26
|
+
attr_reader :observer
|
27
|
+
# Faraday adapter in use.
|
28
|
+
attr_reader :adapter
|
29
|
+
|
30
|
+
##
|
31
|
+
# Create a new Client.
|
32
|
+
#
|
33
|
+
# +params+:: A list of parameters to configure the connection with.
|
34
|
+
# +:domain+:: The domain to send requests to.
|
35
|
+
# +:scheme+:: Scheme to use when sending requests (either +http+ or +https+).
|
36
|
+
# +:port+:: Port to use when sending requests.
|
37
|
+
# +:secret+:: Credentials to use when sending requests. User and pass must be separated by a colon.
|
38
|
+
# +:read_timeout+:: Read timeout in seconds.
|
39
|
+
# +:connection_timeout+:: Open timeout in seconds.
|
40
|
+
# +:observer+:: Callback that will be passed a RequestResult after every completed request.
|
41
|
+
# +:adapter+:: Faraday[https://github.com/lostisland/faraday] adapter to use. Either can be a symbol for the adapter, or an array of arguments.
|
42
|
+
def initialize(params = {})
|
43
|
+
@domain = params[:domain] || 'rest.faunadb.com'
|
44
|
+
@scheme = params[:scheme] || 'https'
|
45
|
+
@port = params[:port] || (scheme == 'https' ? 443 : 80)
|
46
|
+
@read_timeout = params[:read_timeout] || 60
|
47
|
+
@connection_timeout = params[:connection_timeout] || 60
|
48
|
+
@observer = params[:observer]
|
49
|
+
@adapter = params[:adapter] || Faraday.default_adapter
|
50
|
+
init_credentials(params[:secret])
|
51
|
+
|
52
|
+
init_connection
|
8
53
|
end
|
9
54
|
|
10
|
-
|
11
|
-
|
55
|
+
##
|
56
|
+
# Create a new client from the existing config with a given secret.
|
57
|
+
#
|
58
|
+
# +:secret+:: Credentials to use when sending requests. User and pass must be separated by a colon.
|
59
|
+
def with_secret(secret)
|
60
|
+
with_dup do |client|
|
61
|
+
client.send(:init_credentials, secret)
|
62
|
+
end
|
12
63
|
end
|
13
64
|
|
14
|
-
|
15
|
-
|
65
|
+
##
|
66
|
+
# Issues a query to FaunaDB.
|
67
|
+
#
|
68
|
+
# Queries are built via the Query helpers. See {FaunaDB Query API}[https://faunadb.com/documentation/queries]
|
69
|
+
# for information on constructing queries.
|
70
|
+
#
|
71
|
+
# +expression+:: A query expression
|
72
|
+
# +expr_block+:: May be provided instead of expression. Block is used to build an expression with Fauna.query.
|
73
|
+
#
|
74
|
+
# Example using expression:
|
75
|
+
#
|
76
|
+
# <code>client.query(Fauna::Query.add(1, 2, Fauna::Query.subtract(3, 2)))</code>
|
77
|
+
#
|
78
|
+
# Example using block:
|
79
|
+
#
|
80
|
+
# <code>client.query { add(1, 2, subtract(3, 2)) }</code>
|
81
|
+
#
|
82
|
+
# Reference: {Executing FaunaDB Queries}[https://faunadb.com/documentation#queries]
|
83
|
+
#
|
84
|
+
# :category: Query Methods
|
85
|
+
def query(expression = nil, &expr_block)
|
86
|
+
if expr_block.nil?
|
87
|
+
post '', Fauna::Query::Expr.wrap(expression)
|
88
|
+
else
|
89
|
+
post '', Fauna::Query.expr(&expr_block)
|
90
|
+
end
|
16
91
|
end
|
17
92
|
|
18
|
-
|
19
|
-
|
93
|
+
##
|
94
|
+
# Performs a +GET+ request for a REST endpoint.
|
95
|
+
#
|
96
|
+
# +path+:: Path to +GET+.
|
97
|
+
# +query+:: Query parameters to append to the path.
|
98
|
+
#
|
99
|
+
# Reference: {FaunaDB REST API}[https://faunadb.com/documentation/rest]
|
100
|
+
#
|
101
|
+
# :category: REST Methods
|
102
|
+
def get(path, query = {})
|
103
|
+
execute(:get, path.to_s, query)
|
20
104
|
end
|
21
105
|
|
22
|
-
|
23
|
-
|
106
|
+
##
|
107
|
+
# Performs a +POST+ request for a REST endpoint.
|
108
|
+
#
|
109
|
+
# +path+:: Path to +POST+.
|
110
|
+
# +data+:: Data to post as the body. +data+ is automatically converted to JSON.
|
111
|
+
#
|
112
|
+
# Reference: {FaunaDB REST API}[https://faunadb.com/documentation/rest]
|
113
|
+
#
|
114
|
+
# :category: REST Methods
|
115
|
+
def post(path, data = {})
|
116
|
+
execute(:post, path, nil, data)
|
24
117
|
end
|
25
118
|
|
26
|
-
|
27
|
-
|
119
|
+
##
|
120
|
+
# Performs a +PUT+ request for a REST endpoint.
|
121
|
+
#
|
122
|
+
# +path+:: Path to +PUT+.
|
123
|
+
# +data+:: Data to post as the body. +data+ is automatically converted to JSON.
|
124
|
+
#
|
125
|
+
# Reference: {FaunaDB REST API}[https://faunadb.com/documentation/rest]
|
126
|
+
#
|
127
|
+
# :category: REST Methods
|
128
|
+
def put(path, data = {})
|
129
|
+
execute(:put, path, nil, data)
|
28
130
|
end
|
29
131
|
|
30
|
-
|
31
|
-
|
132
|
+
##
|
133
|
+
# Performs a +PATCH+ request for a REST endpoint.
|
134
|
+
#
|
135
|
+
# +path+:: Path to +PATCH+.
|
136
|
+
# +data+:: Data to post as the body. +data+ is automatically converted to JSON.
|
137
|
+
#
|
138
|
+
# Reference: {FaunaDB REST API}[https://faunadb.com/documentation/rest]
|
139
|
+
#
|
140
|
+
# :category: REST Methods
|
141
|
+
def patch(path, data = {})
|
142
|
+
execute(:patch, path, nil, data)
|
32
143
|
end
|
33
144
|
|
34
|
-
|
35
|
-
|
145
|
+
##
|
146
|
+
# Performs a +DELETE+ request for a REST endpoint.
|
147
|
+
#
|
148
|
+
# +path+:: Path to +DELETE+.
|
149
|
+
#
|
150
|
+
# Reference: {FaunaDB REST API}[https://faunadb.com/documentation/rest]
|
151
|
+
#
|
152
|
+
# :category: REST Methods
|
153
|
+
def delete(path)
|
154
|
+
execute(:delete, path)
|
36
155
|
end
|
37
156
|
|
38
|
-
|
39
|
-
|
157
|
+
##
|
158
|
+
# Ping FaunaDB.
|
159
|
+
#
|
160
|
+
# Reference: {FaunaDB Rest API}[https://faunadb.com/documentation#rest-other].
|
161
|
+
#
|
162
|
+
# :category: REST Methods
|
163
|
+
def ping(params = {})
|
164
|
+
get 'ping', params
|
40
165
|
end
|
41
166
|
|
42
|
-
|
43
|
-
|
167
|
+
private
|
168
|
+
|
169
|
+
def with_dup
|
170
|
+
new_client = self.dup
|
171
|
+
yield new_client
|
172
|
+
new_client.send(:init_connection)
|
173
|
+
new_client
|
44
174
|
end
|
45
175
|
|
46
|
-
|
47
|
-
|
176
|
+
def init_credentials(secret)
|
177
|
+
@credentials = secret.to_s.split(':', 2)
|
178
|
+
end
|
48
179
|
|
49
|
-
|
50
|
-
|
180
|
+
def init_connection
|
181
|
+
@connection = Faraday.new(
|
182
|
+
url: "#{scheme}://#{domain}:#{port}/",
|
183
|
+
headers: {
|
184
|
+
'Accept-Encoding' => 'gzip,deflate',
|
185
|
+
'Content-Type' => 'application/json;charset=utf-8',
|
186
|
+
'User-Agent' => "FaunaDB-Ruby/#{Fauna::VERSION}",
|
187
|
+
},
|
188
|
+
request: { timeout: read_timeout, open_timeout: connection_timeout },
|
189
|
+
) do |conn|
|
190
|
+
# Let us specify arguments so we can set stubs for test adapter
|
191
|
+
conn.adapter(*Array(adapter))
|
192
|
+
conn.basic_auth(credentials[0].to_s, credentials[1].to_s)
|
193
|
+
conn.response :fauna_decode
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def execute(action, path, query = nil, data = nil)
|
198
|
+
path = path.to_s
|
199
|
+
|
200
|
+
start_time = Time.now
|
201
|
+
response = perform_request action, path, query, data
|
202
|
+
end_time = Time.now
|
203
|
+
|
204
|
+
response_raw = response.body
|
205
|
+
response_json = FaunaJson.json_load_or_nil response_raw
|
206
|
+
response_content = FaunaJson.deserialize response_json unless response_json.nil?
|
207
|
+
|
208
|
+
request_result = RequestResult.new(self,
|
209
|
+
action, path, query, data,
|
210
|
+
response_raw, response_content, response.status, response.headers,
|
211
|
+
start_time, end_time)
|
212
|
+
|
213
|
+
@observer.call(request_result) unless @observer.nil?
|
214
|
+
|
215
|
+
if response_json.nil?
|
216
|
+
fail UnexpectedError.new('Invalid JSON.', request_result)
|
217
|
+
end
|
218
|
+
|
219
|
+
FaunaError.raise_for_status_code(request_result)
|
220
|
+
UnexpectedError.get_or_raise request_result, response_content, :resource
|
221
|
+
end
|
222
|
+
|
223
|
+
def perform_request(action, path, query, data)
|
224
|
+
@connection.send(action) do |req|
|
225
|
+
req.params = query.delete_if { |_, v| v.nil? } unless query.nil?
|
226
|
+
req.body = FaunaJson.to_json(data) unless data.nil?
|
227
|
+
req.url(path || '')
|
51
228
|
end
|
52
229
|
end
|
53
230
|
end
|
231
|
+
|
232
|
+
# Middleware for decompressing responses
|
233
|
+
class FaunaDecode < Faraday::Middleware # :nodoc:
|
234
|
+
def call(env)
|
235
|
+
@app.call(env).on_complete do |response_env|
|
236
|
+
raw_body = response_env[:body]
|
237
|
+
response_env[:body] =
|
238
|
+
case response_env[:response_headers]['Content-Encoding']
|
239
|
+
when 'gzip'
|
240
|
+
io = StringIO.new raw_body
|
241
|
+
Zlib::GzipReader.new(io, external_encoding: Encoding::UTF_8).read
|
242
|
+
when 'deflate'
|
243
|
+
Zlib::Inflate.inflate raw_body
|
244
|
+
else
|
245
|
+
raw_body
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
Faraday::Response.register_middleware fauna_decode: lambda { FaunaDecode }
|
54
252
|
end
|