fmrest-core 0.13.1 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +1 -0
- data/CHANGELOG.md +21 -0
- data/README.md +128 -83
- data/lib/fmrest.rb +28 -1
- data/lib/fmrest/connection_settings.rb +2 -0
- data/lib/fmrest/v1/connection.rb +2 -2
- data/lib/fmrest/v1/dates.rb +38 -2
- data/lib/fmrest/v1/utils.rb +13 -0
- data/lib/fmrest/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02e8b51abdf2fc9a5b7df29cdad8d5acef8f04b5c6167d7ff94040a716117449
|
4
|
+
data.tar.gz: 6a78ce64f39cd5e41910114eb22948eb5c4f26d26a892ab2b09c0bdcaa6c3fb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3bdd91f7e25de359a7a28746d4c7be4eae7a684b63d909eacae6dd48a7053666386ff6dd3b87895aaf315e6a6b923aadcf0b8713aefa696fadbef25656dbae3b
|
7
|
+
data.tar.gz: 37d292af43be4a6a42b4f4044d3078ec40edff189622e3d4390d4a9ec65e34b0b910b2542ca4293ea3d3925eea8c84f1c944a5d7c7cc22f47bf989113b1017d7
|
data/.yardopts
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
## Changelog
|
2
2
|
|
3
|
+
### 0.16.0
|
4
|
+
|
5
|
+
* Add `FmRest.logger=`
|
6
|
+
* Handle serialization of `nil`, `true` and `false` values
|
7
|
+
|
8
|
+
### 0.15.2
|
9
|
+
|
10
|
+
* Fix autoloading of `FmRest::Layout`
|
11
|
+
|
12
|
+
### 0.15.0
|
13
|
+
|
14
|
+
* Much improved querying API (see documentation on querying), adding new
|
15
|
+
`.query` capabilities, as well as two new methods: `.match` and `.or`
|
16
|
+
|
17
|
+
### 0.14.0
|
18
|
+
|
19
|
+
* Aliased `FmRest::Spyke::Base` as `FmRest::Layout` (now preferred), and
|
20
|
+
provided a shortcut version for setting the layout name (e.g. `class Foo <
|
21
|
+
FmRest::Layout("LayoutName")`)
|
22
|
+
* Made `layout` class setting subclass-inheritable
|
23
|
+
|
3
24
|
### 0.13.1
|
4
25
|
|
5
26
|
* Fix downloading of container field data from FMS19+
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/fmrest.svg?style=flat)](https://rubygems.org/gems/fmrest)
|
4
4
|
![CI](https://github.com/beezwax/fmrest-ruby/workflows/CI/badge.svg)
|
5
|
+
[![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://rubydoc.info/github/beezwax/fmrest-ruby)
|
5
6
|
|
6
7
|
A Ruby client for
|
7
8
|
[FileMaker 18 and 19's Data API](https://help.claris.com/en/data-api-guide)
|
@@ -9,7 +10,7 @@ using
|
|
9
10
|
[Faraday](https://github.com/lostisland/faraday) and with optional
|
10
11
|
ActiveRecord-ish ORM features through [Spyke](https://github.com/balvig/spyke).
|
11
12
|
|
12
|
-
fmrest-ruby only partially implements FileMaker
|
13
|
+
fmrest-ruby only partially implements FileMaker 19's Data API.
|
13
14
|
See the [implementation completeness table](#api-implementation-completeness-table)
|
14
15
|
to see if a feature you need is natively supported by the gem.
|
15
16
|
|
@@ -17,10 +18,10 @@ to see if a feature you need is natively supported by the gem.
|
|
17
18
|
|
18
19
|
The `fmrest` gem is a wrapper for two other gems:
|
19
20
|
|
20
|
-
* `fmrest-
|
21
|
+
* `fmrest-spyke`, providing an ActiveRecord-like ORM library built on top
|
22
|
+
of `fmrest-core` and [Spyke](https://github.com/balvig/spyke).
|
23
|
+
* `fmrest-core`, providing the core Faraday connection builder, session
|
21
24
|
management, and other core utilities.
|
22
|
-
* `fmrest-spyke`, which provides an ActiveRecord-like ORM library built on top
|
23
|
-
of `fmrest-core` and Spyke.
|
24
25
|
|
25
26
|
## Installation
|
26
27
|
|
@@ -30,7 +31,7 @@ Add this to your Gemfile:
|
|
30
31
|
gem 'fmrest'
|
31
32
|
```
|
32
33
|
|
33
|
-
Or if you just want to use the Faraday connection without the ORM features
|
34
|
+
Or if you just want to use the Faraday connection without the ORM features:
|
34
35
|
|
35
36
|
```ruby
|
36
37
|
gem 'fmrest-core'
|
@@ -40,10 +41,11 @@ gem 'fmrest-core'
|
|
40
41
|
|
41
42
|
### ORM example
|
42
43
|
|
43
|
-
Most people would want to use the ORM features
|
44
|
+
Most people would want to use the ORM features:
|
44
45
|
|
45
46
|
```ruby
|
46
|
-
|
47
|
+
# A Layout model connecting to the "Honeybees Web" FileMaker layout
|
48
|
+
class Honeybee < FmRest::Layout("Honeybees Web")
|
47
49
|
# Connection settings
|
48
50
|
self.fmrest_config = {
|
49
51
|
host: "…",
|
@@ -53,13 +55,28 @@ class Honeybee < FmRest::Spyke::Base
|
|
53
55
|
}
|
54
56
|
|
55
57
|
# Mapped attributes
|
56
|
-
attributes name: "Bee Name", age: "Bee Age"
|
58
|
+
attributes name: "Bee Name", age: "Bee Age", created_on: "Created On"
|
57
59
|
|
58
|
-
#
|
59
|
-
has_portal :
|
60
|
+
# Portal associations
|
61
|
+
has_portal :tasks
|
60
62
|
|
61
|
-
# File
|
63
|
+
# File containers
|
62
64
|
container :photo, field_name: "Bee Photo"
|
65
|
+
|
66
|
+
# Scopes
|
67
|
+
scope :can_legally_fly, -> { query(age: ">18") }
|
68
|
+
|
69
|
+
# Client-side validations
|
70
|
+
validates :name, presence: true
|
71
|
+
|
72
|
+
# Callbacks
|
73
|
+
before_save :set_created_on
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def set_created_on
|
78
|
+
self.created_on = Date.today
|
79
|
+
end
|
63
80
|
end
|
64
81
|
|
65
82
|
# Find a record by id
|
@@ -68,7 +85,7 @@ bee = Honeybee.find(9)
|
|
68
85
|
bee.name = "Hutch"
|
69
86
|
|
70
87
|
# Add a new record to portal
|
71
|
-
bee.
|
88
|
+
bee.tasks.build(urgency: "Today")
|
72
89
|
|
73
90
|
bee.save
|
74
91
|
```
|
@@ -88,11 +105,11 @@ connection = FmRest::V1.build_connection(
|
|
88
105
|
)
|
89
106
|
|
90
107
|
# Get all records (as parsed JSON)
|
91
|
-
connection.get("layouts/
|
108
|
+
connection.get("layouts/FancyLayout/records")
|
92
109
|
|
93
110
|
# Create new record
|
94
111
|
connection.post do |req|
|
95
|
-
req.url "layouts/
|
112
|
+
req.url "layouts/FancyLayout/records"
|
96
113
|
|
97
114
|
# You can just pass a hash for the JSON body
|
98
115
|
req.body = { … }
|
@@ -128,13 +145,14 @@ You can also pass a `:log` option for basic request logging, see the section on
|
|
128
145
|
Option | Description | Format | Default
|
129
146
|
--------------------|--------------------------------------------|-----------------------------|--------
|
130
147
|
`:host` | Hostname with optional port, e.g. `"example.com:9000"` | String | None
|
131
|
-
`:database` |
|
132
|
-
`:username` |
|
133
|
-
`:password` |
|
148
|
+
`:database` | The name of the database to connect to | String | None
|
149
|
+
`:username` | A Data API-ready account | String | None
|
150
|
+
`:password` | Your password | String | None
|
134
151
|
`:account_name` | Alias of `:username` | String | None
|
135
152
|
`:ssl` | SSL options to be forwarded to Faraday | Faraday SSL options | None
|
136
153
|
`:proxy` | Proxy options to be forwarded to Faraday | Faraday proxy options | None
|
137
154
|
`:log` | Log JSON responses to STDOUT | Boolean | `false`
|
155
|
+
`:log_level` | Which log level to log into | Values accepted by `Logger#level=` | `:debug`
|
138
156
|
`:coerce_dates` | See section on [date fields](#date-fields-and-timezones) | Boolean \| `:hybrid` \| `:full` | `false`
|
139
157
|
`:date_format` | Date parsing format | String (FM date format) | `"MM/dd/yyyy"`
|
140
158
|
`:timestamp_format` | Timestmap parsing format | String (FM date format) | `"MM/dd/yyyy HH:mm:ss"`
|
@@ -157,8 +175,8 @@ FmRest.default_connection_settings = {
|
|
157
175
|
}
|
158
176
|
```
|
159
177
|
|
160
|
-
These settings will be used by default by `FmRest::
|
161
|
-
|
178
|
+
These settings will be used by default by `FmRest::Layout` models whenever you
|
179
|
+
don't set `fmrest_config=` explicitly, as well as by
|
162
180
|
`FmRest::V1.build_connection` in case you're setting up your Faraday connection
|
163
181
|
manually.
|
164
182
|
|
@@ -188,11 +206,11 @@ building REST ORM models. fmrest-ruby builds its ORM features atop Spyke,
|
|
188
206
|
bundled in the `fmrest-spyke` gem (already included if you're using the
|
189
207
|
`fmrest` gem).
|
190
208
|
|
191
|
-
To create a model you can inherit directly from `FmRest::
|
192
|
-
|
209
|
+
To create a model you can inherit directly from `FmRest::Layout` (itself a
|
210
|
+
subclass of `Spyke::Base`).
|
193
211
|
|
194
212
|
```ruby
|
195
|
-
class Honeybee < FmRest::
|
213
|
+
class Honeybee < FmRest::Layout
|
196
214
|
end
|
197
215
|
```
|
198
216
|
|
@@ -216,17 +234,23 @@ bee = Honeybee.find(9) # GET request
|
|
216
234
|
|
217
235
|
It's recommended that you read Spyke's documentation for more information on
|
218
236
|
these basic features. If you've used ActiveRecord or similar ORM libraries
|
219
|
-
|
237
|
+
you'll find it quite familiar.
|
238
|
+
|
239
|
+
Notice that `FmRest::Layout` is aliased as `FmRest::Spyke::Base`. Previous
|
240
|
+
versions of fmrest-ruby only provided the latter version, so if you're already
|
241
|
+
using `FmRest::Spyke::Base` there's no need to rename your classes to
|
242
|
+
`FmRest::Layout`, both will continue to work interchangeably.
|
220
243
|
|
221
|
-
In addition, `FmRest::
|
244
|
+
In addition, `FmRest::Layout` extends `Spyke::Base` with the following
|
222
245
|
features:
|
223
246
|
|
224
|
-
###
|
247
|
+
### FmRest::Layout.fmrest_config=
|
225
248
|
|
226
|
-
This allows you to set
|
249
|
+
This allows you to set Data API connection settings specific to your model
|
250
|
+
class:
|
227
251
|
|
228
252
|
```ruby
|
229
|
-
class Honeybee < FmRest::
|
253
|
+
class Honeybee < FmRest::Layout
|
230
254
|
self.fmrest_config = {
|
231
255
|
host: "…",
|
232
256
|
database: "…",
|
@@ -244,9 +268,8 @@ does the initial connection setup and then inherit from it in models using that
|
|
244
268
|
same connection. E.g.:
|
245
269
|
|
246
270
|
```ruby
|
247
|
-
class BeeBase < FmRest::
|
248
|
-
self.fmrest_config = { host: "…", … }
|
249
|
-
}
|
271
|
+
class BeeBase < FmRest::Layout
|
272
|
+
self.fmrest_config = { host: "…", database: "…", … }
|
250
273
|
end
|
251
274
|
|
252
275
|
class Honeybee < BeeBase
|
@@ -254,34 +277,46 @@ class Honeybee < BeeBase
|
|
254
277
|
end
|
255
278
|
```
|
256
279
|
|
280
|
+
Also, if not set, your model will try to use
|
281
|
+
`FmRest.default_connection_settings` instead.
|
282
|
+
|
257
283
|
#### Connection settings overlays
|
258
284
|
|
259
285
|
There may be cases where you want to use a different set of connection settings
|
260
286
|
depending on context. For example, if you want to use username and password
|
261
|
-
provided by the user in a web application. Since
|
262
|
-
at the class level, changing the username/password for the model in one
|
263
|
-
would also change it in all other contexts, leading to security issues.
|
287
|
+
provided by the user in a web application. Since `.fmrest_config`
|
288
|
+
is set at the class level, changing the username/password for the model in one
|
289
|
+
context would also change it in all other contexts, leading to security issues.
|
264
290
|
|
265
291
|
To solve this scenario, fmrest-ruby provides a way of defining thread-local and
|
266
|
-
reversible connection settings overlays through
|
292
|
+
reversible connection settings overlays through
|
293
|
+
`.fmrest_config_overlay=`.
|
267
294
|
|
268
295
|
See the [main document on connection setting overlays](docs/ConfigOverlays.md)
|
269
296
|
for details on how it works.
|
270
297
|
|
271
|
-
###
|
298
|
+
### FmRest::Layout.layout
|
272
299
|
|
273
|
-
Use `
|
300
|
+
Use `layout` to set the layout name for your model.
|
274
301
|
|
275
302
|
```ruby
|
276
|
-
class Honeybee < FmRest::
|
303
|
+
class Honeybee < FmRest::Layout
|
277
304
|
layout "Honeybees Web"
|
278
305
|
end
|
279
306
|
```
|
280
307
|
|
281
|
-
|
282
|
-
the layout
|
308
|
+
Alternatively, if you're inheriting from `FmRest::Layout` directly you can set
|
309
|
+
the layout name in the class definition line:
|
283
310
|
|
284
|
-
|
311
|
+
```ruby
|
312
|
+
class Honeybee < FmRest::Layout("Honeybees Web")
|
313
|
+
```
|
314
|
+
|
315
|
+
Note that you only need to manually set the layout name if the name of the
|
316
|
+
class and the name of the layout differ, otherwise fmrest-ruby will just use
|
317
|
+
the name of the class.
|
318
|
+
|
319
|
+
### FmRest::Layout.request_auth_token
|
285
320
|
|
286
321
|
Requests a Data API session token using the connection settings in
|
287
322
|
`fmrest_config` and returns it if successful, otherwise returns `false`.
|
@@ -290,16 +325,16 @@ You normally don't need to use this method as fmrest-ruby will automatically
|
|
290
325
|
request and store session tokens for you (provided that `:autologin` is
|
291
326
|
`true`).
|
292
327
|
|
293
|
-
###
|
328
|
+
### FmRest::Layout.logout
|
294
329
|
|
295
|
-
Use
|
330
|
+
Use `.logout` to log out from the database session (you may call it on any
|
296
331
|
model that uses the database session you want to log out from).
|
297
332
|
|
298
333
|
```ruby
|
299
334
|
Honeybee.logout
|
300
335
|
```
|
301
336
|
|
302
|
-
### Mapped
|
337
|
+
### Mapped FmRest::Layout.attributes
|
303
338
|
|
304
339
|
Spyke allows you to define your model's attributes using `attributes`, however
|
305
340
|
sometimes FileMaker's field names aren't very Ruby-ORM-friendly, especially
|
@@ -308,7 +343,7 @@ fmrest-ruby extends `attributes`' functionality to allow you to map
|
|
308
343
|
Ruby-friendly attribute names to FileMaker field names. E.g.:
|
309
344
|
|
310
345
|
```ruby
|
311
|
-
class Honeybee < FmRest::
|
346
|
+
class Honeybee < FmRest::Layout
|
312
347
|
attributes first_name: "First Name", last_name: "Last Name"
|
313
348
|
end
|
314
349
|
```
|
@@ -327,16 +362,16 @@ bee.first_name = "Queen"
|
|
327
362
|
bee.attributes # => { "First Name": "Queen", "Last Name": "Buzz" }
|
328
363
|
```
|
329
364
|
|
330
|
-
###
|
365
|
+
### FmRest::Layout.has_portal
|
331
366
|
|
332
367
|
You can define portal associations on your model wth `has_portal`, as such:
|
333
368
|
|
334
369
|
```ruby
|
335
|
-
class Honeybee < FmRest::
|
370
|
+
class Honeybee < FmRest::Layout
|
336
371
|
has_portal :flowers
|
337
372
|
end
|
338
373
|
|
339
|
-
class Flower < FmRest::
|
374
|
+
class Flower < FmRest::Layout
|
340
375
|
attributes :color, :species
|
341
376
|
end
|
342
377
|
```
|
@@ -371,8 +406,8 @@ Guides](https://guides.rubyonrails.org/active_model_basics.html#dirty).
|
|
371
406
|
Since Spyke is API-agnostic it only provides a wide-purpose `.where` method for
|
372
407
|
passing arbitrary parameters to the REST backend. fmrest-ruby however is well
|
373
408
|
aware of its backend API, so it extends Spkye models with a bunch of useful
|
374
|
-
querying methods: `.query`, `.
|
375
|
-
etc.
|
409
|
+
querying methods: `.query`, `.match`, `.omit`, `.limit`, `.offset`, `.sort`,
|
410
|
+
`.portal`, `.script`, etc.
|
376
411
|
|
377
412
|
See the [main document on querying](docs/Querying.md) for detailed information
|
378
413
|
on the query API methods.
|
@@ -393,7 +428,7 @@ detailed information on how those work.
|
|
393
428
|
You can define container fields on your model class with `container`:
|
394
429
|
|
395
430
|
```ruby
|
396
|
-
class Honeybee < FmRest::
|
431
|
+
class Honeybee < FmRest::Layout
|
397
432
|
container :photo, field_name: "Beehive Photo ID"
|
398
433
|
end
|
399
434
|
```
|
@@ -411,7 +446,7 @@ details.
|
|
411
446
|
|
412
447
|
### Setting global field values
|
413
448
|
|
414
|
-
You can call `.set_globals` on any `FmRest::
|
449
|
+
You can call `.set_globals` on any `FmRest::Layout` model to set global
|
415
450
|
field values on the database that model is configured for.
|
416
451
|
|
417
452
|
See the [main document on setting global field values](docs/GlobalFields.md)
|
@@ -423,7 +458,7 @@ If using `fmrest-spyke` with Rails then pretty log output will be set up for
|
|
423
458
|
you automatically by Spyke (see [their
|
424
459
|
README](https://github.com/balvig/spyke#log-output)).
|
425
460
|
|
426
|
-
You can also enable simple Faraday
|
461
|
+
You can also enable simple Faraday logging of raw requests (useful for
|
427
462
|
debugging) by passing `log: true` in the options hash for either
|
428
463
|
`FmRest.default_connection_settings=` or your models' `fmrest_config=`, e.g.:
|
429
464
|
|
@@ -435,7 +470,7 @@ FmRest.default_connection_settings = {
|
|
435
470
|
}
|
436
471
|
|
437
472
|
# Or in your model
|
438
|
-
class LoggyBee < FmRest::
|
473
|
+
class LoggyBee < FmRest::Layout
|
439
474
|
self.fmrest_config = {
|
440
475
|
host: "…",
|
441
476
|
…
|
@@ -444,12 +479,22 @@ class LoggyBee < FmRest::Spyke::Base
|
|
444
479
|
end
|
445
480
|
```
|
446
481
|
|
447
|
-
|
482
|
+
You can also pass `log_level` to connection settings to change the severity of
|
483
|
+
log output (defaults to `:debug`).
|
484
|
+
|
485
|
+
By default fmrest-ruby logs to STDOUT or to Rails' logger object if available.
|
486
|
+
You can change this by providing your own logger object to `FmRest.logger=`:
|
487
|
+
|
488
|
+
```ruby
|
489
|
+
FmRest.logger = Logger.new("fmrest.log")
|
490
|
+
```
|
491
|
+
|
492
|
+
If you need to set up more complex logging for your models you can use the
|
448
493
|
`faraday` block inside your class to inject your own logger middleware into the
|
449
494
|
Faraday connection, e.g.:
|
450
495
|
|
451
496
|
```ruby
|
452
|
-
class LoggyBee < FmRest::
|
497
|
+
class LoggyBee < FmRest::Layout
|
453
498
|
faraday do |conn|
|
454
499
|
conn.response :logger, MyApp.logger, bodies: true
|
455
500
|
end
|
@@ -460,31 +505,31 @@ end
|
|
460
505
|
|
461
506
|
FM Data API reference: https://fmhelp.filemaker.com/docs/18/en/dataapi/
|
462
507
|
|
463
|
-
| FM 18 Data API feature | Supported by basic connection | Supported by FmRest::
|
464
|
-
|
465
|
-
| Log in using HTTP Basic Auth | Yes | Yes
|
466
|
-
| Log in using OAuth | No | No
|
467
|
-
| Log in to an external data source | No | No
|
468
|
-
| Log in using a FileMaker ID account | No | No
|
469
|
-
| Log out | Yes | Yes
|
470
|
-
| Get product information | Manual* | No
|
471
|
-
| Get database names | Manual* | No
|
472
|
-
| Get script names | Manual* | No
|
473
|
-
| Get layout names | Manual* | No
|
474
|
-
| Get layout metadata | Manual* | No
|
475
|
-
| Create a record | Manual* | Yes
|
476
|
-
| Edit a record | Manual* | Yes
|
477
|
-
| Duplicate a record | Manual* | No
|
478
|
-
| Delete a record | Manual* | Yes
|
479
|
-
| Edit portal records | Manual* | Yes
|
480
|
-
| Get a single record | Manual* | Yes
|
481
|
-
| Get a range of records | Manual* | Yes
|
482
|
-
| Get container data | Manual* | Yes
|
483
|
-
| Upload container data | Manual* | Yes
|
484
|
-
| Perform a find request | Manual* | Yes
|
485
|
-
| Set global field values | Manual* | Yes
|
486
|
-
| Run a script | Manual* | Yes
|
487
|
-
| Run a script with another request | Manual* | Yes
|
508
|
+
| FM 18 Data API feature | Supported by basic connection | Supported by FmRest::Layout |
|
509
|
+
|-------------------------------------|-------------------------------|-----------------------------|
|
510
|
+
| Log in using HTTP Basic Auth | Yes | Yes |
|
511
|
+
| Log in using OAuth | No | No |
|
512
|
+
| Log in to an external data source | No | No |
|
513
|
+
| Log in using a FileMaker ID account | No | No |
|
514
|
+
| Log out | Yes | Yes |
|
515
|
+
| Get product information | Manual* | No |
|
516
|
+
| Get database names | Manual* | No |
|
517
|
+
| Get script names | Manual* | No |
|
518
|
+
| Get layout names | Manual* | No |
|
519
|
+
| Get layout metadata | Manual* | No |
|
520
|
+
| Create a record | Manual* | Yes |
|
521
|
+
| Edit a record | Manual* | Yes |
|
522
|
+
| Duplicate a record | Manual* | No |
|
523
|
+
| Delete a record | Manual* | Yes |
|
524
|
+
| Edit portal records | Manual* | Yes |
|
525
|
+
| Get a single record | Manual* | Yes |
|
526
|
+
| Get a range of records | Manual* | Yes |
|
527
|
+
| Get container data | Manual* | Yes |
|
528
|
+
| Upload container data | Manual* | Yes |
|
529
|
+
| Perform a find request | Manual* | Yes |
|
530
|
+
| Set global field values | Manual* | Yes |
|
531
|
+
| Run a script | Manual* | Yes |
|
532
|
+
| Run a script with another request | Manual* | Yes |
|
488
533
|
|
489
534
|
\* You can manually supply the URL and JSON to a `FmRest` connection.
|
490
535
|
|
@@ -519,6 +564,6 @@ See [LICENSE.txt](LICENSE.txt).
|
|
519
564
|
|
520
565
|
## Disclaimer
|
521
566
|
|
522
|
-
This project is not sponsored by or otherwise affiliated with
|
523
|
-
an Apple subsidiary. FileMaker is a trademark of
|
524
|
-
the U.S. and other countries.
|
567
|
+
This project is not sponsored by or otherwise affiliated with Claris
|
568
|
+
International Inc., an Apple Inc. subsidiary. FileMaker is a trademark of
|
569
|
+
Claris International Inc., registered in the U.S. and other countries.
|
data/lib/fmrest.rb
CHANGED
@@ -11,12 +11,17 @@ module FmRest
|
|
11
11
|
autoload :V1, "fmrest/v1"
|
12
12
|
autoload :TokenStore, "fmrest/token_store"
|
13
13
|
autoload :Spyke, "fmrest/spyke"
|
14
|
+
autoload :Layout, "fmrest/spyke"
|
14
15
|
|
15
16
|
class << self
|
16
17
|
attr_accessor :token_store
|
18
|
+
attr_writer :logger
|
17
19
|
|
18
20
|
def default_connection_settings=(settings)
|
19
|
-
|
21
|
+
# Skip validation since we may use the defaults for half-complete
|
22
|
+
# settings
|
23
|
+
@default_connection_settings =
|
24
|
+
ConnectionSettings.wrap(settings, skip_validation: true)
|
20
25
|
end
|
21
26
|
|
22
27
|
def default_connection_settings
|
@@ -32,5 +37,27 @@ module FmRest
|
|
32
37
|
warn "[DEPRECATION] `FmRest.config` is deprecated, use `FmRest.default_connection_settings` instead"
|
33
38
|
default_connection_settings
|
34
39
|
end
|
40
|
+
|
41
|
+
def logger
|
42
|
+
@logger ||= if defined?(Rails)
|
43
|
+
Rails.logger
|
44
|
+
else
|
45
|
+
require "logger"
|
46
|
+
Logger.new($stdout)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Shortcut for FmRest::V1.escape_find_operators
|
51
|
+
#
|
52
|
+
# @param (see FmRest::V1.escape_find_operators
|
53
|
+
# @return (see FmRest::V1.escape_find_operators
|
54
|
+
def e(s)
|
55
|
+
V1.escape_find_operators(s)
|
56
|
+
end
|
57
|
+
|
58
|
+
def Layout(*_)
|
59
|
+
require "fmrest/spyke"
|
60
|
+
self.Layout(*_)
|
61
|
+
end
|
35
62
|
end
|
36
63
|
end
|
@@ -24,6 +24,7 @@ module FmRest
|
|
24
24
|
ssl
|
25
25
|
proxy
|
26
26
|
log
|
27
|
+
log_level
|
27
28
|
coerce_dates
|
28
29
|
date_format
|
29
30
|
timestamp_format
|
@@ -45,6 +46,7 @@ module FmRest
|
|
45
46
|
DEFAULTS = {
|
46
47
|
autologin: true,
|
47
48
|
log: false,
|
49
|
+
log_level: :debug,
|
48
50
|
date_format: DEFAULT_DATE_FORMAT,
|
49
51
|
time_format: DEFAULT_TIME_FORMAT,
|
50
52
|
timestamp_format: DEFAULT_TIMESTAMP_FORMAT,
|
data/lib/fmrest/v1/connection.rb
CHANGED
@@ -41,7 +41,7 @@ module FmRest
|
|
41
41
|
end
|
42
42
|
|
43
43
|
if settings.log
|
44
|
-
conn.response :logger,
|
44
|
+
conn.response :logger, FmRest.logger, bodies: true, headers: true, log_level: settings.log_level
|
45
45
|
end
|
46
46
|
|
47
47
|
conn.adapter Faraday.default_adapter
|
@@ -61,7 +61,7 @@ module FmRest
|
|
61
61
|
conn.basic_auth settings.username!, settings.password!
|
62
62
|
|
63
63
|
if settings.log
|
64
|
-
conn.response :logger,
|
64
|
+
conn.response :logger, FmRest.logger, bodies: true, headers: true, log_level: settings.log_level
|
65
65
|
end
|
66
66
|
|
67
67
|
conn.response :json
|
data/lib/fmrest/v1/dates.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
module FmRest
|
4
4
|
module V1
|
5
5
|
module Dates
|
6
|
+
FM_DATE_FORMAT = "%m/%d/%Y"
|
7
|
+
FM_DATETIME_FORMAT = "#{FM_DATE_FORMAT} %H:%M:%S"
|
6
8
|
FM_DATETIME_FORMAT_MATCHER = /MM|mm|dd|HH|ss|yyyy/.freeze
|
7
9
|
|
8
10
|
FM_DATE_TO_STRPTIME_SUBSTITUTIONS = {
|
@@ -55,8 +57,8 @@ module FmRest
|
|
55
57
|
# Takes a DateTime dt, and returns the correct local offset for that dt,
|
56
58
|
# daylight savings included, in fraction of a day.
|
57
59
|
#
|
58
|
-
# By default, if ActiveSupport's Time.zone is set it will be used
|
59
|
-
# of the system timezone.
|
60
|
+
# By default, if ActiveSupport's `Time.zone` is set it will be used
|
61
|
+
# instead of the system timezone.
|
60
62
|
#
|
61
63
|
# @param dt [DateTime] The DateTime to get the offset for
|
62
64
|
# @param zone [nil, String, TimeZone] The timezone to use to calculate
|
@@ -76,6 +78,40 @@ module FmRest
|
|
76
78
|
|
77
79
|
Rational(time.utc_offset, 86400) # seconds in one day (24*60*60)
|
78
80
|
end
|
81
|
+
|
82
|
+
# Returns a list of all datetime classes recognized by fmrest-ruby,
|
83
|
+
# including `FmRest::StringDateTime` if defined. Useful for using in a
|
84
|
+
# `case .. when` statement.
|
85
|
+
#
|
86
|
+
def datetime_classes
|
87
|
+
[DateTime, Time, defined?(FmRest::StringDateTime) && FmRest::StringDateTime].compact.freeze
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns a list of all date classes recognized by fmrest-ruby, including
|
91
|
+
# `FmRest::StringDate` if defined. Useful for using in a `case .. when`
|
92
|
+
# statement.
|
93
|
+
#
|
94
|
+
def date_classes
|
95
|
+
[Date, defined?(FmRest::StringDate) && FmRest::StringDate].compact.freeze
|
96
|
+
end
|
97
|
+
|
98
|
+
# Converts the given DateTime dt to the specified timezone setting offset,
|
99
|
+
# leaving everything else intact.
|
100
|
+
#
|
101
|
+
# @param dt [DateTime] The datetime to convert
|
102
|
+
# @param timezone [nil, Symbol, String] Accepted values are `:utc`,
|
103
|
+
# `:local`, or `nil` (in which case it leaves the given datetime intact)
|
104
|
+
# @return [DateTime] A new datetime with converted timezone
|
105
|
+
def convert_datetime_timezone(dt, timezone)
|
106
|
+
case timezone
|
107
|
+
when :utc, "utc"
|
108
|
+
dt.new_offset(0)
|
109
|
+
when :local, "local"
|
110
|
+
dt.new_offset(FmRest::V1.local_offset_for_datetime(dt))
|
111
|
+
when nil
|
112
|
+
dt
|
113
|
+
end
|
114
|
+
end
|
79
115
|
end
|
80
116
|
end
|
81
117
|
end
|
data/lib/fmrest/v1/utils.rb
CHANGED
@@ -5,6 +5,9 @@ module FmRest
|
|
5
5
|
module Utils
|
6
6
|
VALID_SCRIPT_KEYS = [:prerequest, :presort, :after].freeze
|
7
7
|
|
8
|
+
# See https://help.claris.com/en/pro-help/content/finding-text.html
|
9
|
+
FM_FIND_OPERATORS_RE = /([@\*#\?!=<>"])/
|
10
|
+
|
8
11
|
# Converts custom script options to a hash with the Data API's expected
|
9
12
|
# JSON script format.
|
10
13
|
#
|
@@ -91,6 +94,16 @@ module FmRest
|
|
91
94
|
}
|
92
95
|
end
|
93
96
|
|
97
|
+
# Escapes FileMaker find operators from the given string in order to use
|
98
|
+
# it in a find request.
|
99
|
+
#
|
100
|
+
# @param s [String] The string to escape
|
101
|
+
# @return [String] A new string with find operators escaped with
|
102
|
+
# backslashes
|
103
|
+
def escape_find_operators(s)
|
104
|
+
s.gsub(FM_FIND_OPERATORS_RE, "\\\\\\1")
|
105
|
+
end
|
106
|
+
|
94
107
|
private
|
95
108
|
|
96
109
|
def convert_script_arguments(script_arguments, suffix = nil)
|
data/lib/fmrest/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fmrest-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pedro Carbajal
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|