fmrest 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +95 -101
- data/lib/fmrest/spyke/model/orm.rb +1 -1
- 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: 82a15caf470d1410554f5d83be7424fe52f765c9dd3e767de8f46dd7269155ea
|
4
|
+
data.tar.gz: bedcd15af94048c775b67a68532044f88cd7c7787a94b93c2b01d60cb8024177
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10df0d8b008c1b0dbf0920fc6dc0f77a04bd638c8269d76f95d3046fdc3c15256ead1a32b4108fcab9bfbfd33afd2e1b80f760a53d7846023d0773d93b415c4d
|
7
|
+
data.tar.gz: 9bcf3d0816ec7f00472a9525af97cc7b26fc4b6e71f9b032e4bcb2ae8edb03e59e6413166e9d2c1a47215fd5d07caf0a2435d79e1d58e6c0ae7298190cea1c7a
|
data/README.md
CHANGED
@@ -14,7 +14,8 @@ anyway).
|
|
14
14
|
If you're looking for a Ruby client for the legacy XML/Custom Web Publishing
|
15
15
|
API try the fabulous [ginjo-rfm gem](https://github.com/ginjo/rfm) instead.
|
16
16
|
|
17
|
-
fmrest-ruby does not currently implement the full spec of FileMaker Data
|
17
|
+
fmrest-ruby does not currently implement the full spec of FileMaker 17's Data
|
18
|
+
API.
|
18
19
|
|
19
20
|
## Installation
|
20
21
|
|
@@ -141,7 +142,7 @@ require "fmrest/spyke"
|
|
141
142
|
And finally extend your Spyke models with `FmRest::Spyke`:
|
142
143
|
|
143
144
|
```ruby
|
144
|
-
class
|
145
|
+
class Honeybee < Spyke::Base
|
145
146
|
include FmRest::Spyke
|
146
147
|
end
|
147
148
|
```
|
@@ -155,37 +156,35 @@ Alternatively you can inherit directly from the shorthand
|
|
155
156
|
`FmRest::Spyke` already included:
|
156
157
|
|
157
158
|
```ruby
|
158
|
-
class
|
159
|
+
class Honeybee < FmRest::Spyke::Base
|
159
160
|
end
|
160
161
|
```
|
161
162
|
|
162
163
|
In this case you can pass the `fmrest_config` hash as an argument to `Base()`:
|
163
164
|
|
164
165
|
```ruby
|
165
|
-
class
|
166
|
+
class Honeybee < FmRest::Spyke::Base(host: "...", database: "...", username: "...", password: "...")
|
166
167
|
end
|
167
168
|
|
168
|
-
|
169
|
+
Honeybee.fmrest_config # => { host: "...", database: "...", username: "...", password: "..." }
|
169
170
|
```
|
170
171
|
|
171
172
|
All of Spyke's basic ORM operations work:
|
172
173
|
|
173
174
|
```ruby
|
174
|
-
|
175
|
+
bee = Honeybee.new
|
175
176
|
|
176
|
-
|
177
|
+
bee.name = "Hutch"
|
178
|
+
bee.save # POST request
|
177
179
|
|
178
|
-
|
180
|
+
bee.name = "ハッチ"
|
181
|
+
bee.save # PATCH request
|
179
182
|
|
180
|
-
|
183
|
+
bee.reload # GET request
|
181
184
|
|
182
|
-
|
185
|
+
bee.destroy # DELETE request
|
183
186
|
|
184
|
-
|
185
|
-
|
186
|
-
kitty.destroy # DELETE request
|
187
|
-
|
188
|
-
kitty = Kitty.find(9) # GET request
|
187
|
+
bee = Honeybee.find(9) # GET request
|
189
188
|
```
|
190
189
|
|
191
190
|
Read Spyke's documentation for more information on these basic features.
|
@@ -198,7 +197,7 @@ features:
|
|
198
197
|
Usually to tell a Spyke object to use a certain Faraday connection you'd use:
|
199
198
|
|
200
199
|
```ruby
|
201
|
-
class
|
200
|
+
class Honeybee < Spyke::Base
|
202
201
|
self.connection = Faraday.new(...)
|
203
202
|
end
|
204
203
|
```
|
@@ -207,14 +206,14 @@ fmrest-ruby simplfies the process of setting up your Spyke model with a Faraday
|
|
207
206
|
connection by allowing you to just set your Data API connection settings:
|
208
207
|
|
209
208
|
```ruby
|
210
|
-
class
|
209
|
+
class Honeybee < Spyke::Base
|
211
210
|
include FmRest::Spyke
|
212
211
|
|
213
212
|
self.fmrest_config = {
|
214
213
|
host: "example.com",
|
215
|
-
database: "
|
216
|
-
username: "
|
217
|
-
password: "
|
214
|
+
database: "My Database",
|
215
|
+
username: "...",
|
216
|
+
password: "..."
|
218
217
|
}
|
219
218
|
end
|
220
219
|
```
|
@@ -227,19 +226,19 @@ does the initial connection setup and then inherit from it in models using that
|
|
227
226
|
same connection. E.g.:
|
228
227
|
|
229
228
|
```ruby
|
230
|
-
class
|
229
|
+
class BeeBase < Spyke::Base
|
231
230
|
include FmRest::Spyke
|
232
231
|
|
233
232
|
self.fmrest_config = {
|
234
233
|
host: "example.com",
|
235
234
|
database: "My Database",
|
236
|
-
username: "
|
237
|
-
password: "
|
235
|
+
username: "...",
|
236
|
+
password: "..."
|
238
237
|
}
|
239
238
|
end
|
240
239
|
|
241
|
-
class
|
242
|
-
# This model will use the same connection as
|
240
|
+
class Honeybee < BeeBase
|
241
|
+
# This model will use the same connection as BeeBase
|
243
242
|
end
|
244
243
|
```
|
245
244
|
|
@@ -248,8 +247,8 @@ end
|
|
248
247
|
Use `layout` to set the `:layout` part of API URLs, e.g.:
|
249
248
|
|
250
249
|
```ruby
|
251
|
-
class
|
252
|
-
layout "
|
250
|
+
class Honeybee < FmRest::Spyke::Base
|
251
|
+
layout "Honeybees Web" # uri path will be "layouts/Honeybees%20Web/records(/:id)"
|
253
252
|
end
|
254
253
|
```
|
255
254
|
|
@@ -268,7 +267,7 @@ fmrest-ruby extends `attributes`' functionality to allow you to map
|
|
268
267
|
Ruby-friendly attribute names to FileMaker field names. E.g.:
|
269
268
|
|
270
269
|
```ruby
|
271
|
-
class
|
270
|
+
class Honeybee < FmRest::Spyke::Base
|
272
271
|
attributes first_name: "First Name", last_name: "Last Name"
|
273
272
|
end
|
274
273
|
```
|
@@ -277,14 +276,14 @@ You can then simply use the pretty attribute names whenever working with your
|
|
277
276
|
model and they will get mapped to their FileMaker fields:
|
278
277
|
|
279
278
|
```ruby
|
280
|
-
|
279
|
+
bee = Honeybee.find(1)
|
281
280
|
|
282
|
-
|
283
|
-
|
281
|
+
bee.first_name # => "Princess"
|
282
|
+
bee.last_name # => "Buzz"
|
284
283
|
|
285
|
-
|
284
|
+
bee.first_name = "Queen"
|
286
285
|
|
287
|
-
|
286
|
+
bee.attributes # => { "First Name": "Queen", "Last Name": "Buzz" }
|
288
287
|
```
|
289
288
|
|
290
289
|
### Model.has_portal
|
@@ -292,26 +291,26 @@ kitty.attributes # => { "First Name": "Dr.", "Last Name": "Fluffers" }
|
|
292
291
|
You can define portal associations on your model as such:
|
293
292
|
|
294
293
|
```ruby
|
295
|
-
class
|
296
|
-
has_portal :
|
294
|
+
class Honeybee < FmRest::Spyke::Base
|
295
|
+
has_portal :flowers
|
297
296
|
end
|
298
297
|
|
299
|
-
class
|
300
|
-
attributes :color, :
|
298
|
+
class Flower < FmRest::Spyke::Base
|
299
|
+
attributes :color, :species
|
301
300
|
end
|
302
301
|
```
|
303
302
|
|
304
303
|
In this case fmrest-ruby will expect the portal table name and portal object
|
305
|
-
name to be both "
|
306
|
-
|
304
|
+
name to be both "flowers", i.e. the expected portal JSON portion should look
|
305
|
+
like this:
|
307
306
|
|
308
307
|
```json
|
309
308
|
...
|
310
309
|
"portalData": {
|
311
|
-
"
|
310
|
+
"flowers": [
|
312
311
|
{
|
313
|
-
"
|
314
|
-
"
|
312
|
+
"flowers::color": "red",
|
313
|
+
"flowers::species": "rose"
|
315
314
|
}
|
316
315
|
]
|
317
316
|
}
|
@@ -319,51 +318,46 @@ look like this:
|
|
319
318
|
|
320
319
|
If you need to specify different values for them you can do so with
|
321
320
|
`portal_key` for the portal table name, and `attribute_prefix` for the portal
|
322
|
-
object name, e.g.:
|
321
|
+
object name, and `class_name`, e.g.:
|
323
322
|
|
324
323
|
```ruby
|
325
|
-
class
|
326
|
-
has_portal :
|
324
|
+
class Honeybee < FmRest::Spyke::Base
|
325
|
+
has_portal :pollinated_flowers, portal_key: "Bee Flowers",
|
326
|
+
attribute_prefix: "Flower",
|
327
|
+
class_name: "Flower"
|
327
328
|
end
|
328
329
|
```
|
329
330
|
|
330
|
-
The above expects the following portal JSON
|
331
|
+
The above will use the `Flower` model class and expects the following portal JSON
|
332
|
+
portion:
|
331
333
|
|
332
334
|
```json
|
333
335
|
...
|
334
336
|
"portalData": {
|
335
|
-
"
|
337
|
+
"Bee Flowers": [
|
336
338
|
{
|
337
|
-
"
|
338
|
-
"
|
339
|
+
"Flower::color": "white",
|
340
|
+
"Flower::species": "rose"
|
339
341
|
}
|
340
342
|
]
|
341
343
|
}
|
342
344
|
```
|
343
345
|
|
344
|
-
You can also specify a different class name with the `class_name` option:
|
345
|
-
|
346
|
-
```ruby
|
347
|
-
class Kitty < FmRest::Spyke::Base
|
348
|
-
has_portal :wool_yarns, class_name: "FancyWoolYarn"
|
349
|
-
end
|
350
|
-
```
|
351
|
-
|
352
346
|
### Dirty attributes
|
353
347
|
|
354
348
|
fmrest-ruby includes support for ActiveModel's Dirty mixin out of the box,
|
355
349
|
providing methods like:
|
356
350
|
|
357
351
|
```ruby
|
358
|
-
|
352
|
+
bee = Honeybee.new
|
359
353
|
|
360
|
-
|
354
|
+
bee.changed? # => false
|
361
355
|
|
362
|
-
|
356
|
+
bee.name = "Maya"
|
363
357
|
|
364
|
-
|
358
|
+
bee.changed? # => true
|
365
359
|
|
366
|
-
|
360
|
+
bee.name_changed? # => true
|
367
361
|
```
|
368
362
|
|
369
363
|
fmrest-ruby uses the Dirty functionality to only send changed attributes back
|
@@ -380,12 +374,12 @@ aware of its backend API, so it extends Spkye models with a bunch of useful
|
|
380
374
|
querying methods.
|
381
375
|
|
382
376
|
```ruby
|
383
|
-
class
|
377
|
+
class Honeybee < Spyke::Base
|
384
378
|
include FmRest::Spyke
|
385
379
|
|
386
|
-
attributes name: "
|
380
|
+
attributes name: "Bee Name", age: "Bee Age"
|
387
381
|
|
388
|
-
has_portal :
|
382
|
+
has_portal :hives, portal_key: "Bee Hives"
|
389
383
|
end
|
390
384
|
```
|
391
385
|
|
@@ -394,7 +388,7 @@ end
|
|
394
388
|
`.limit` sets the limit for get and find request:
|
395
389
|
|
396
390
|
```ruby
|
397
|
-
|
391
|
+
Honeybee.limit(10)
|
398
392
|
```
|
399
393
|
|
400
394
|
#### .offset
|
@@ -402,7 +396,7 @@ Kitty.limit(10)
|
|
402
396
|
`.offset` sets the offset for get and find requests:
|
403
397
|
|
404
398
|
```ruby
|
405
|
-
|
399
|
+
Honeybee.offset(10)
|
406
400
|
```
|
407
401
|
|
408
402
|
#### .sort
|
@@ -410,16 +404,16 @@ Kitty.offset(10)
|
|
410
404
|
`.sort` (or `.order`) sets sorting options for get and find requests:
|
411
405
|
|
412
406
|
```ruby
|
413
|
-
|
414
|
-
|
407
|
+
Honeybee.sort(:name, :age)
|
408
|
+
Honeybee.order(:name, :age) # alias method
|
415
409
|
```
|
416
410
|
|
417
411
|
You can set descending sort order by appending either `!` or `__desc` to a sort
|
418
412
|
attribute (defaults to ascending order):
|
419
413
|
|
420
414
|
```ruby
|
421
|
-
|
422
|
-
|
415
|
+
Honeybee.sort(:name, :age!)
|
416
|
+
Honeybee.sort(:name, :age__desc)
|
423
417
|
```
|
424
418
|
|
425
419
|
#### .portal
|
@@ -428,8 +422,8 @@ Kitty.sort(:name, :age__desc)
|
|
428
422
|
(this recognizes portals defined with `has_portal`):
|
429
423
|
|
430
424
|
```ruby
|
431
|
-
|
432
|
-
|
425
|
+
Honeybee.portal(:hives)
|
426
|
+
Honeybee.includes(:hives) # alias method
|
433
427
|
```
|
434
428
|
|
435
429
|
#### .query
|
@@ -438,24 +432,24 @@ Kitty.includes(:toys) # alias method
|
|
438
432
|
defined with `attributes`):
|
439
433
|
|
440
434
|
```ruby
|
441
|
-
|
442
|
-
# JSON -> {"query": [{"
|
435
|
+
Honeybee.query(name: "Hutch")
|
436
|
+
# JSON -> {"query": [{"Bee Name": "Hutch"}]}
|
443
437
|
```
|
444
438
|
|
445
439
|
Passing multiple attributes to `.query` will group them in the same JSON object:
|
446
440
|
|
447
441
|
```ruby
|
448
|
-
|
449
|
-
# JSON -> {"query": [{"
|
442
|
+
Honeybee.query(name: "Hutch", age: 4)
|
443
|
+
# JSON -> {"query": [{"Bee Name": "Hutch", "Bee Age": 4}]}
|
450
444
|
```
|
451
445
|
|
452
446
|
Calling `.query` multiple times or passing it multiple hashes creates separate
|
453
447
|
JSON objects (so you can define OR queries):
|
454
448
|
|
455
449
|
```ruby
|
456
|
-
|
457
|
-
|
458
|
-
# JSON -> {"query": [{"
|
450
|
+
Honeybee.query(name: "Hutch").query(name: "Maya")
|
451
|
+
Honeybee.query({ name: "Hutch" }, { name: "Maya" })
|
452
|
+
# JSON -> {"query": [{"Bee Name": "Hutch"}, {"Bee Name": "Maya"}]}
|
459
453
|
```
|
460
454
|
|
461
455
|
#### .omit
|
@@ -463,15 +457,15 @@ Kitty.query({ name: "Mr. Fluffers" }, { name: "Coronel Chai Latte" })
|
|
463
457
|
`.omit` works like `.query` but excludes matches:
|
464
458
|
|
465
459
|
```ruby
|
466
|
-
|
467
|
-
# JSON -> {"query": [{"
|
460
|
+
Honeybee.omit(name: "Hutch")
|
461
|
+
# JSON -> {"query": [{"Bee Name": "Hutch", "omit": "true"}]}
|
468
462
|
```
|
469
463
|
|
470
464
|
You can get the same effect by passing `omit: true` to `.query`:
|
471
465
|
|
472
466
|
```ruby
|
473
|
-
|
474
|
-
# JSON -> {"query": [{"
|
467
|
+
Honeybee.query(name: "Hutch", omit: true)
|
468
|
+
# JSON -> {"query": [{"Bee Name": "Hutch", "omit": "true"}]}
|
475
469
|
```
|
476
470
|
|
477
471
|
#### Other notes on querying
|
@@ -479,35 +473,35 @@ Kitty.query(name: "Captain Whiskers", omit: true)
|
|
479
473
|
You can chain all query methods together:
|
480
474
|
|
481
475
|
```ruby
|
482
|
-
|
476
|
+
Honeybee.limit(10).offset(20).sort(:name, :age!).portal(:hives).query(name: "Hutch")
|
483
477
|
```
|
484
478
|
|
485
479
|
You can also set default values for limit and sort on the class:
|
486
480
|
|
487
481
|
```ruby
|
488
|
-
|
489
|
-
|
482
|
+
Honeybee.default_limit = 1000
|
483
|
+
Honeybee.default_sort = [:name, :age!]
|
490
484
|
```
|
491
485
|
|
492
486
|
Calling any `Enumerable` method on the resulting scope object will trigger a
|
493
487
|
server request, so you can treat the scope as a collection:
|
494
488
|
|
495
489
|
```ruby
|
496
|
-
|
490
|
+
Honeybee.limit(10).sort(:name).each { |bee| ... }
|
497
491
|
```
|
498
492
|
|
499
493
|
If you want to explicitly run the request instead you can use `.find_some` on
|
500
494
|
the scope object:
|
501
495
|
|
502
496
|
```ruby
|
503
|
-
|
497
|
+
Honeybee.limit(10).sort(:name).find_some # => [<Honeybee...>, ...]
|
504
498
|
```
|
505
499
|
|
506
500
|
If you want just a single result you can use `.find_one` instead (this will
|
507
501
|
force `.limit(1)`):
|
508
502
|
|
509
503
|
```ruby
|
510
|
-
|
504
|
+
Honeybee.query(name: "Hutch").find_one # => <Honeybee...>
|
511
505
|
```
|
512
506
|
|
513
507
|
NOTE: If you know the id of the record you should use `.find(id)` instead of
|
@@ -515,7 +509,7 @@ NOTE: If you know the id of the record you should use `.find(id)` instead of
|
|
515
509
|
instead of `POST ../:layout/_find`).
|
516
510
|
|
517
511
|
```ruby
|
518
|
-
|
512
|
+
Honeybee.find(89) # => <Honeybee...>
|
519
513
|
```
|
520
514
|
|
521
515
|
### Container fields
|
@@ -523,8 +517,8 @@ Kitty.find(89) # => <Kitty...>
|
|
523
517
|
You can define container fields on your model class with `container`:
|
524
518
|
|
525
519
|
```ruby
|
526
|
-
class
|
527
|
-
container :photo, field_name: "
|
520
|
+
class Honeybee < FmRest::Spyke::Base
|
521
|
+
container :photo, field_name: "Beehive Photo ID"
|
528
522
|
end
|
529
523
|
```
|
530
524
|
|
@@ -538,13 +532,13 @@ addition to the `container` definition.)
|
|
538
532
|
This will provide you with the following instance methods:
|
539
533
|
|
540
534
|
```ruby
|
541
|
-
|
535
|
+
bee = Honeybee.new
|
542
536
|
|
543
|
-
|
537
|
+
bee.photo.url # The URL of the container file on the FileMaker server
|
544
538
|
|
545
|
-
|
539
|
+
bee.photo.download # Download the contents of the container as an IO object
|
546
540
|
|
547
|
-
|
541
|
+
bee.photo.upload(filename_or_io) # Upload a file to the container
|
548
542
|
```
|
549
543
|
|
550
544
|
`upload` also accepts an options hash with the following options:
|
@@ -575,12 +569,12 @@ FmRest.config = {
|
|
575
569
|
}
|
576
570
|
|
577
571
|
# Or in your model
|
578
|
-
class
|
572
|
+
class LoggyBee < FmRest::Spyke::Base
|
579
573
|
self.fmrest_config = {
|
580
574
|
host: "example.com",
|
581
575
|
database: "My Database",
|
582
|
-
username: "
|
583
|
-
password: "
|
576
|
+
username: "...",
|
577
|
+
password: "...",
|
584
578
|
log: true
|
585
579
|
}
|
586
580
|
end
|
@@ -593,7 +587,7 @@ If you need to set up more complex logging for your models can use the
|
|
593
587
|
Faraday connection, e.g.:
|
594
588
|
|
595
589
|
```ruby
|
596
|
-
class
|
590
|
+
class LoggyBee < FmRest::Spyke::Base
|
597
591
|
faraday do |conn|
|
598
592
|
conn.response :logger, MyApp.logger, bodies: true
|
599
593
|
end
|
@@ -61,7 +61,7 @@ module FmRest
|
|
61
61
|
where_options["#{prefix}limit"] = scope.limit_value if scope.limit_value
|
62
62
|
where_options["#{prefix}offset"] = scope.offset_value if scope.offset_value
|
63
63
|
|
64
|
-
if scope.sort_params.present?
|
64
|
+
if scope.sort_params.present?
|
65
65
|
where_options["#{prefix}sort"] =
|
66
66
|
prefixed ? scope.sort_params.to_json : scope.sort_params
|
67
67
|
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.1
|
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-
|
11
|
+
date: 2019-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|