fmrest 0.2.3 → 0.2.4
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.md +8 -0
- data/README.md +39 -5
- data/lib/fmrest.rb +15 -1
- data/lib/fmrest/spyke/container_field.rb +1 -1
- data/lib/fmrest/spyke/model/connection.rb +1 -1
- data/lib/fmrest/v1/connection.rb +30 -3
- data/lib/fmrest/v1/container_fields.rb +47 -9
- data/lib/fmrest/v1/token_session.rb +2 -2
- data/lib/fmrest/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3b6d6aed0ef181daf2e8a254809704f09f65e6720f29adad829d028b7429322
|
4
|
+
data.tar.gz: 7d7007ff6968884ebb293e99ef901706d70a3c95721a893443cb16c9e69ac7da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd2ffd6cf2f3622b5efff65925dc5a73e3380a8270f0a6650898385620b144e2c8f7199d5512f1cce500bd973ca70e13440b5d219a6abeccb5c28b684b6a190f
|
7
|
+
data.tar.gz: ad43d73a77f18dc138b90400fc9b8213f61bce9b8659a7c84ba3c5cedeb00fcd2fca900a461125ef859263548dbf570f263b8212a698a990ab97adedffb6aff9
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
## Changelog
|
2
|
+
|
3
|
+
### 0.2.4
|
4
|
+
|
5
|
+
* Use `String#=~` instead of `String#match?` for Ruby <2.4 compatibility (Fixes
|
6
|
+
[#26](https://github.com/beezwax/fmrest-ruby/issues/26))
|
7
|
+
* Deprecate `FmRest.config` in favor of `FmRest.default_connection_settings`
|
8
|
+
* Honor Faraday SSL and proxy settings when fetching container files
|
data/README.md
CHANGED
@@ -63,6 +63,42 @@ end
|
|
63
63
|
For each request fmrest-ruby will first request a session token (using the
|
64
64
|
provided username and password) if it doesn't yet have one in store.
|
65
65
|
|
66
|
+
## Connection settings
|
67
|
+
|
68
|
+
In addition to the required `:host`, `:database`, `:username` and `:password`
|
69
|
+
connection options, you can also pass `:ssl` and `:proxy`, which are passed to
|
70
|
+
the underlying [Faraday](https://github.com/lostisland/faraday) connection.
|
71
|
+
|
72
|
+
You can use this to, for instance, disable SSL verification:
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
FmRest::V1.build_connection(
|
76
|
+
host: "example.com",
|
77
|
+
...
|
78
|
+
ssl: { verify: false }
|
79
|
+
)
|
80
|
+
```
|
81
|
+
|
82
|
+
You can use the `:log` option for basic request logging, see the section on
|
83
|
+
[Logging](#Logging) below.
|
84
|
+
|
85
|
+
### Default connection settings
|
86
|
+
|
87
|
+
If you're only connecting to a single FM database you can configure it globally
|
88
|
+
through `FmRest.default_connection_settings=`. E.g.:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
FmRest.default_connection_settings = {
|
92
|
+
host: "example.com",
|
93
|
+
database: "database name",
|
94
|
+
username: "username",
|
95
|
+
password: "password"
|
96
|
+
}
|
97
|
+
```
|
98
|
+
|
99
|
+
This configuration will be used by default by `FmRest::V1.build_connection` as
|
100
|
+
well as your models whenever you don't pass a configuration hash explicitly.
|
101
|
+
|
66
102
|
## Session token store
|
67
103
|
|
68
104
|
By default fmrest-ruby will use a memory-based store for the session tokens.
|
@@ -556,11 +592,11 @@ for you automatically by Spyke (see [their
|
|
556
592
|
README](https://github.com/balvig/spyke#log-output)).
|
557
593
|
|
558
594
|
You can also enable simple STDOUT logging (useful for debugging) by passing
|
559
|
-
`log: true` in the options hash for either
|
560
|
-
`fmrest_config=`, e.g.:
|
595
|
+
`log: true` in the options hash for either
|
596
|
+
`FmRest.default_connection_settings=` or your models' `fmrest_config=`, e.g.:
|
561
597
|
|
562
598
|
```ruby
|
563
|
-
FmRest.
|
599
|
+
FmRest.default_connection_settings = {
|
564
600
|
host: "example.com",
|
565
601
|
database: "My Database",
|
566
602
|
username: "z3r0c00l",
|
@@ -580,8 +616,6 @@ class LoggyBee < FmRest::Spyke::Base
|
|
580
616
|
end
|
581
617
|
```
|
582
618
|
|
583
|
-
Note that the log option set in `FmRest.config` is ignored by models.
|
584
|
-
|
585
619
|
If you need to set up more complex logging for your models can use the
|
586
620
|
`faraday` block inside your class to inject your own logger middleware into the
|
587
621
|
Faraday connection, e.g.:
|
data/lib/fmrest.rb
CHANGED
@@ -10,6 +10,20 @@ module FmRest
|
|
10
10
|
class << self
|
11
11
|
attr_accessor :token_store
|
12
12
|
|
13
|
-
|
13
|
+
attr_writer :default_connection_settings
|
14
|
+
|
15
|
+
def default_connection_settings
|
16
|
+
@default_connection_settings || {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def config=(connection_hash)
|
20
|
+
warn "[DEPRECATION] `FmRest.config=` is deprecated, use `FmRest.default_connection_settings=` instead"
|
21
|
+
self.default_connection_settings = connection_hash
|
22
|
+
end
|
23
|
+
|
24
|
+
def config
|
25
|
+
warn "[DEPRECATION] `FmRest.config` is deprecated, use `FmRest.default_connection_settings` instead"
|
26
|
+
default_connection_settings
|
27
|
+
end
|
14
28
|
end
|
15
29
|
end
|
@@ -21,7 +21,7 @@ module FmRest
|
|
21
21
|
|
22
22
|
# @return (see FmRest::V1::ContainerFields#fetch_container_data)
|
23
23
|
def download
|
24
|
-
FmRest::V1.fetch_container_data(url)
|
24
|
+
FmRest::V1.fetch_container_data(url, @base.class.connection)
|
25
25
|
end
|
26
26
|
|
27
27
|
# @param filename_or_io [String, IO] a path to the file to upload or an
|
@@ -38,7 +38,7 @@ module FmRest
|
|
38
38
|
private
|
39
39
|
|
40
40
|
def fmrest_connection
|
41
|
-
@fmrest_connection ||= FmRest::V1.build_connection(fmrest_config || FmRest.
|
41
|
+
@fmrest_connection ||= FmRest::V1.build_connection(fmrest_config || FmRest.default_connection_settings) do |conn|
|
42
42
|
faraday_block.call(conn) if faraday_block
|
43
43
|
|
44
44
|
# Pass the class to JsonParser's initializer so it can have
|
data/lib/fmrest/v1/connection.rb
CHANGED
@@ -9,7 +9,14 @@ module FmRest
|
|
9
9
|
module Connection
|
10
10
|
BASE_PATH = "/fmi/data/v1/databases".freeze
|
11
11
|
|
12
|
-
|
12
|
+
# Builds a complete DAPI Faraday connection with middleware already
|
13
|
+
# configured to handle authentication, JSON parsing, logging and DAPI
|
14
|
+
# error handling. A block can be optionally given for additional
|
15
|
+
# middleware configuration
|
16
|
+
#
|
17
|
+
# @option (see #base_connection)
|
18
|
+
# @return (see #base_connection)
|
19
|
+
def build_connection(options = FmRest.default_connection_settings, &block)
|
13
20
|
base_connection(options) do |conn|
|
14
21
|
conn.use RaiseErrors
|
15
22
|
conn.use TokenSession, options
|
@@ -37,7 +44,19 @@ module FmRest
|
|
37
44
|
end
|
38
45
|
end
|
39
46
|
|
40
|
-
|
47
|
+
# Builds a base Faraday connection with base URL constructed from
|
48
|
+
# connection options and passes it the given block
|
49
|
+
#
|
50
|
+
# @option options [String] :host The hostname for the FM server
|
51
|
+
# @option options [String] :database The FM database name
|
52
|
+
# @option options [String] :username The username for DAPI authentication
|
53
|
+
# @option options [String] :password The password for DAPI authentication
|
54
|
+
# @option options [String] :ssl SSL options to forward to the Faraday
|
55
|
+
# connection
|
56
|
+
# @option options [String] :proxy Proxy options to forward to the Faraday
|
57
|
+
# connection
|
58
|
+
# @return [Faraday] The new Faraday connection
|
59
|
+
def base_connection(options = FmRest.default_connection_settings, &block)
|
41
60
|
host = options.fetch(:host)
|
42
61
|
|
43
62
|
# Default to HTTPS
|
@@ -50,7 +69,15 @@ module FmRest
|
|
50
69
|
scheme = uri.scheme
|
51
70
|
end
|
52
71
|
|
53
|
-
|
72
|
+
faraday_options = {}
|
73
|
+
faraday_options[:ssl] = options[:ssl] if options.key?(:ssl)
|
74
|
+
faraday_options[:proxy] = options[:proxy] if options.key?(:proxy)
|
75
|
+
|
76
|
+
Faraday.new(
|
77
|
+
"#{scheme}://#{host}#{BASE_PATH}/#{URI.escape(options.fetch(:database))}/".freeze,
|
78
|
+
faraday_options,
|
79
|
+
&block
|
80
|
+
)
|
54
81
|
end
|
55
82
|
end
|
56
83
|
end
|
@@ -9,13 +9,20 @@ module FmRest
|
|
9
9
|
# object with its body content (see Ruby's OpenURI for how the IO object
|
10
10
|
# is extended with useful HTTP response information).
|
11
11
|
#
|
12
|
-
# This method uses
|
12
|
+
# This method uses OpenURI instead of Faraday for fetching the actual
|
13
|
+
# container file.
|
13
14
|
#
|
14
15
|
# @raise [FmRest::ContainerFieldError] if any step fails
|
15
|
-
# @param container_field_url [String]
|
16
|
+
# @param container_field_url [String] The URL to the container to
|
16
17
|
# download
|
17
|
-
# @
|
18
|
-
|
18
|
+
# @param base_connection [Faraday::Connection] An optional Faraday
|
19
|
+
# connection to use as base settings for the container requests, useful
|
20
|
+
# if you need to set SSL or proxy settings. If given, this connection
|
21
|
+
# will not be used directly, but rather a new one with copied SSL and
|
22
|
+
# proxy options. If omitted, `FmRest.default_connection_settings`'s
|
23
|
+
# `:ssl` and `:proxy` options will be used instead (if available)
|
24
|
+
# @return [IO] The contents of the container
|
25
|
+
def fetch_container_data(container_field_url, base_connection = nil)
|
19
26
|
require "open-uri"
|
20
27
|
|
21
28
|
begin
|
@@ -29,25 +36,29 @@ module FmRest
|
|
29
36
|
raise FmRest::ContainerFieldError, "Container URL is not HTTP (#{container_field_url})"
|
30
37
|
end
|
31
38
|
|
32
|
-
|
39
|
+
conn =
|
40
|
+
Faraday.new(nil,
|
41
|
+
ssl: base_connection ? base_connection.ssl.to_hash : FmRest.default_connection_settings[:ssl],
|
42
|
+
proxy: base_connection ? base_connection.proxy.to_hash : FmRest.default_connection_settings[:proxy]
|
43
|
+
)
|
33
44
|
|
34
45
|
# Requesting the container URL with no cookie set will respond with a
|
35
46
|
# redirect and a session cookie
|
36
|
-
cookie_response =
|
47
|
+
cookie_response = conn.get url
|
37
48
|
|
38
|
-
unless cookie = cookie_response["Set-Cookie"]
|
49
|
+
unless cookie = cookie_response.headers["Set-Cookie"]
|
39
50
|
raise FmRest::ContainerFieldError, "Container field's initial request didn't return a session cookie, the URL may be stale (try downloading it again immediately after retrieving the record)"
|
40
51
|
end
|
41
52
|
|
42
53
|
# Now request the URL again with the proper session cookie using
|
43
54
|
# OpenURI, which wraps the response in an IO object which also responds
|
44
55
|
# to #content_type
|
45
|
-
url.open("Cookie" => cookie)
|
56
|
+
url.open(faraday_connection_to_openuri_options(conn).merge("Cookie" => cookie))
|
46
57
|
end
|
47
58
|
|
48
59
|
# Handles the core logic of uploading a file into a container field
|
49
60
|
#
|
50
|
-
# @param connection [Faraday] the Faraday connection to use
|
61
|
+
# @param connection [Faraday::Connection] the Faraday connection to use
|
51
62
|
# @param container_path [String] the path to the container
|
52
63
|
# @param filename_or_io [String, IO] a path to the file to upload or an
|
53
64
|
# IO object
|
@@ -68,6 +79,33 @@ module FmRest
|
|
68
79
|
request.body = { upload: Faraday::UploadIO.new(filename_or_io, content_type, filename) }
|
69
80
|
end
|
70
81
|
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
# Copies a Faraday::Connection's relevant options to
|
86
|
+
# OpenURI::OpenRead#open format
|
87
|
+
#
|
88
|
+
def faraday_connection_to_openuri_options(conn)
|
89
|
+
openuri_opts = {}
|
90
|
+
|
91
|
+
if !conn.ssl.empty?
|
92
|
+
openuri_opts[:ssl_verify_mode] =
|
93
|
+
conn.ssl.fetch(:verify, true) ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
|
94
|
+
|
95
|
+
openuri_opts[:ssl_ca_cert] = conn.ssl.cert_store if conn.ssl.cert_store
|
96
|
+
end
|
97
|
+
|
98
|
+
if conn.proxy && !conn.proxy.empty?
|
99
|
+
if conn.proxy.user && conn.proxy.password
|
100
|
+
openuri_opts[:proxy_http_basic_authentication] =
|
101
|
+
[conn.proxy.uri.tap { |u| u.userinfo = ""}, conn.proxy.user, conn.proxy.password]
|
102
|
+
else
|
103
|
+
openuri_opts[:proxy] = conn.proxy.uri
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
openuri_opts
|
108
|
+
end
|
71
109
|
end
|
72
110
|
end
|
73
111
|
end
|
@@ -8,7 +8,7 @@ module FmRest
|
|
8
8
|
HEADER_KEY = "Authorization".freeze
|
9
9
|
TOKEN_STORE_INTERFACE = [:load, :store, :delete].freeze
|
10
10
|
|
11
|
-
def initialize(app, options = FmRest.
|
11
|
+
def initialize(app, options = FmRest.default_connection_settings)
|
12
12
|
super(app)
|
13
13
|
@options = options
|
14
14
|
end
|
@@ -71,7 +71,7 @@ module FmRest
|
|
71
71
|
begin
|
72
72
|
# Strip the host part to just the hostname (i.e. no scheme or port)
|
73
73
|
host = @options.fetch(:host)
|
74
|
-
host = URI(host).hostname if host
|
74
|
+
host = URI(host).hostname if host =~ /\Ahttps?:\/\//
|
75
75
|
"#{host}:#{@options.fetch(:database)}"
|
76
76
|
end
|
77
77
|
end
|
data/lib/fmrest/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fmrest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pedro Carbajal
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07
|
11
|
+
date: 2019-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -188,6 +188,7 @@ files:
|
|
188
188
|
- ".rspec"
|
189
189
|
- ".travis.yml"
|
190
190
|
- ".yardopts"
|
191
|
+
- CHANGELOG.md
|
191
192
|
- CODE_OF_CONDUCT.md
|
192
193
|
- Gemfile
|
193
194
|
- LICENSE.txt
|