fmrest 0.6.0 → 0.10.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.md +29 -0
- data/README.md +175 -40
- data/lib/fmrest/spyke.rb +1 -1
- data/lib/fmrest/spyke/base.rb +2 -0
- data/lib/fmrest/spyke/model.rb +2 -0
- data/lib/fmrest/spyke/model/associations.rb +2 -2
- data/lib/fmrest/spyke/model/connection.rb +30 -11
- data/lib/fmrest/spyke/model/global_fields.rb +40 -0
- data/lib/fmrest/spyke/model/orm.rb +2 -1
- data/lib/fmrest/spyke/model/serialization.rb +16 -5
- data/lib/fmrest/spyke/relation.rb +73 -0
- data/lib/fmrest/spyke/{json_parser.rb → spyke_formatter.rb} +50 -17
- data/lib/fmrest/string_date.rb +220 -0
- data/lib/fmrest/v1.rb +6 -0
- data/lib/fmrest/v1/connection.rb +8 -7
- data/lib/fmrest/v1/dates.rb +81 -0
- data/lib/fmrest/v1/token_session.rb +2 -0
- data/lib/fmrest/v1/type_coercer.rb +192 -0
- data/lib/fmrest/v1/utils.rb +1 -0
- data/lib/fmrest/version.rb +1 -1
- metadata +7 -4
- data/CODE_OF_CONDUCT.md +0 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53c6e0d0260a3b825c031831136651a5f2252d8d0cebd8e2077919caf13d0fb6
|
4
|
+
data.tar.gz: 215b6d2a7735ce0a3109ae542f400aa0bee0d60f8808225fc4d77c52009c37d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fdbb4dbc83ed0409e6680e8ffd028794ac01c07335ca43c95bd076e99359c17151b14634cb1a77bd41043ad104566ad5f820805de73d1f683aa957b02ad4fa5
|
7
|
+
data.tar.gz: 15966e4cc59a6bb9161f6edd6250beaa948d1c5c69ff911b3f2ca1eba2f782d79b8097c2038513e3ad4b84263b6b9e5f812cc7c37708a72f8a52d8db454b078f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,34 @@
|
|
1
1
|
## Changelog
|
2
2
|
|
3
|
+
### 0.10.0
|
4
|
+
|
5
|
+
* Added `FmRest::StringDateAwareness` module to correct some issues when using
|
6
|
+
`FmRest::StringDate`
|
7
|
+
* Added basic timezones support
|
8
|
+
* Deprecated `class < FmRest::Spyke::Base(config_hash)` syntax in favor of
|
9
|
+
using `self.fmrest_config=`
|
10
|
+
|
11
|
+
### 0.9.0
|
12
|
+
|
13
|
+
* Added `FmRest::Spyke::Base.set_globals`
|
14
|
+
|
15
|
+
### 0.8.0
|
16
|
+
|
17
|
+
* Improved metadata when using `FmRest::Spyke::Model`. Metadata now uses
|
18
|
+
Struct/OpenStruct, so properties are accessible through `.property`, as well
|
19
|
+
as `[:property]`
|
20
|
+
* Added batch-finders `.find_in_batches` and `.find_each` for
|
21
|
+
* `FmRest::Spyke::Base`
|
22
|
+
|
23
|
+
### 0.7.1
|
24
|
+
|
25
|
+
* Made sure `Model.find_one` and `Model.find_some` work without needing to call
|
26
|
+
`Model.all` in between
|
27
|
+
|
28
|
+
### 0.7.0
|
29
|
+
|
30
|
+
* Added date coercion feature
|
31
|
+
|
3
32
|
### 0.6.0
|
4
33
|
|
5
34
|
* Implemented session logout
|
data/README.md
CHANGED
@@ -105,6 +105,23 @@ You can also pass a `:log` option for basic request logging, see the section on
|
|
105
105
|
`:username` is also aliased as `:account_name` to provide cross-compatibility
|
106
106
|
with the ginjo-rfm gem.
|
107
107
|
|
108
|
+
### Full list of available options
|
109
|
+
|
110
|
+
Option | Description | Format | Default
|
111
|
+
--------------------|--------------------------------------------|-----------------------------|--------
|
112
|
+
`:host` | Hostname with optional port, e.g. `"example.com:9000"` | String | None
|
113
|
+
`:database` | | String | None
|
114
|
+
`:username` | | String | None
|
115
|
+
`:password` | | String | None
|
116
|
+
`:ssl` | SSL options to be forwarded to Faraday | Faraday SSL options | None
|
117
|
+
`:proxy` | Proxy options to be forwarded to Faraday | Faraday proxy options | None
|
118
|
+
`:log` | Log JSON responses to STDOUT | Boolean | `false`
|
119
|
+
`:coerce_dates` | See section on [date fields](#date-fields) | Boolean \| `:hybrid` \| `:full` | `false`
|
120
|
+
`:date_format` | Date parsing format | String (FM date format) | `"MM/dd/yyyy"`
|
121
|
+
`:timestamp_format` | Timestmap parsing format | String (FM date format) | `"MM/dd/yyyy HH:mm:ss"`
|
122
|
+
`:time_format` | Time parsing format | String (FM date format) | `"HH:mm:ss"`
|
123
|
+
`:timezone` | The timezone for the FM server | `:local` \| `:utc` \: `nil` | `nil`
|
124
|
+
|
108
125
|
### Default connection settings
|
109
126
|
|
110
127
|
If you're only connecting to a single FM database you can configure it globally
|
@@ -122,6 +139,7 @@ FmRest.default_connection_settings = {
|
|
122
139
|
This configuration will be used by default by `FmRest::V1.build_connection` as
|
123
140
|
well as your models whenever you don't pass a configuration hash explicitly.
|
124
141
|
|
142
|
+
|
125
143
|
## Session token store
|
126
144
|
|
127
145
|
By default fmrest-ruby will use a memory-based store for the session tokens.
|
@@ -178,7 +196,7 @@ FmRest.token_store = FmRest::TokenStore::Redis.new(redis: Redis.new, prefix: "my
|
|
178
196
|
FmRest.token_store = FmRest::TokenStore::Redis.new(prefix: "my-fancy-prefix:", host: "10.0.1.1", port: 6380, db: 15)
|
179
197
|
```
|
180
198
|
|
181
|
-
|
199
|
+
NOTE: redis-rb is not included as a gem dependency of fmrest-ruby, so you'll
|
182
200
|
have to add it to your Gemfile.
|
183
201
|
|
184
202
|
### Moneta
|
@@ -215,9 +233,79 @@ FmRest.token_store = FmRest::TokenStore::Moneta.new(
|
|
215
233
|
)
|
216
234
|
```
|
217
235
|
|
218
|
-
|
236
|
+
NOTE: the moneta gem is not included as a dependency of fmrest-ruby, so
|
219
237
|
you'll have to add it to your Gemfile.
|
220
238
|
|
239
|
+
|
240
|
+
## Date fields
|
241
|
+
|
242
|
+
Since the Data API uses JSON (wich doesn't provide a native date/time object),
|
243
|
+
dates and timestamps are received in string format. By default fmrest-ruby
|
244
|
+
leaves those string fields untouched, but it provides an opt-in feature to try
|
245
|
+
to automatically "coerce" them into Ruby date objects.
|
246
|
+
|
247
|
+
The connection option `:coerce_dates` controls this feature. Possible values
|
248
|
+
are:
|
249
|
+
|
250
|
+
* `:full` - whenever a string matches the given date/timestamp/time format,
|
251
|
+
convert them to `Date` or `DateTime` objects as appropriate
|
252
|
+
* `:hybrid` or `true` - similar as above, but instead of converting to regular
|
253
|
+
`Date`/`DateTime` it converts strings to `FmRest::StringDate` and
|
254
|
+
`FmRest::StringDateTime`, "hybrid" classes provided by fmrest-ruby that
|
255
|
+
retain the functionality of `String` while also providing most the
|
256
|
+
functionality of `Date`/`DateTime` (more on this below)
|
257
|
+
* `false` - disable date coercion entirely (default), leave original string
|
258
|
+
values untouched
|
259
|
+
|
260
|
+
Enabling date coercion works with both basic fmrest-ruby connections and Spyke
|
261
|
+
models (ORM).
|
262
|
+
|
263
|
+
The connection options `:date_format`, `:timestamp_format` and `:time_format`
|
264
|
+
control how to match and parse dates. You only need to provide these if you use
|
265
|
+
a date/time localization different from American format (the default).
|
266
|
+
|
267
|
+
Future versions of fmrest-ruby will provide better (and less heuristic) ways of
|
268
|
+
specifying and/or detecting date fields (e.g. by requesting layout metadata or
|
269
|
+
a DSL in model classes).
|
270
|
+
|
271
|
+
### Hybrid string/date objects
|
272
|
+
|
273
|
+
`FmRest::StringDate` and `FmRest::StringDateTime` are special classes that
|
274
|
+
inherit from `String`, but internally parse and store a `Date` or `DateTime`,
|
275
|
+
and delegate any methods not provided by `String` to those objects. In other
|
276
|
+
words, they quack like a duck *and* bark like a dog.
|
277
|
+
|
278
|
+
You can use these when you want fmrest-ruby to provide you with date objects,
|
279
|
+
but you don't want to worry about date coercion of false positives (i.e. a
|
280
|
+
string field that gets converted to `Date` because it just so matched the given
|
281
|
+
date format).
|
282
|
+
|
283
|
+
Be warned however that these classes come with a fair share of known gotchas
|
284
|
+
(see GitHub wiki for more info). Some of those gothas can be removed by calling
|
285
|
+
|
286
|
+
```ruby
|
287
|
+
FmRest::StringDateAwareness.enable
|
288
|
+
```
|
289
|
+
|
290
|
+
Which will extend the core `Date` and `DateTime` classes to be aware of
|
291
|
+
`FmRest::StringDate`, especially when calling `Date.===`, `Date.parse` or
|
292
|
+
`Date._parse`.
|
293
|
+
|
294
|
+
If you're working with ActiveRecord models this will also make them accept
|
295
|
+
`FmRest::StringDate` values for date fields.
|
296
|
+
|
297
|
+
### Timezones
|
298
|
+
|
299
|
+
fmrest-ruby has basic timezone support. You can set the `:timezone` option in
|
300
|
+
your connection settings to one of the following values:
|
301
|
+
|
302
|
+
* `:local` - dates will be converted to your system local time offset (as
|
303
|
+
defined by `ENV["TZ"]`), or the timezone set by `Time.zone` if you're using
|
304
|
+
ActiveSupport
|
305
|
+
* `:utc` - dates will be converted to UTC offset
|
306
|
+
* `nil` - (default) ignore timezones altogether
|
307
|
+
|
308
|
+
|
221
309
|
## Spyke support (ActiveRecord-like ORM)
|
222
310
|
|
223
311
|
[Spyke](https://github.com/balvig/spyke) is an ActiveRecord-like gem for
|
@@ -257,17 +345,6 @@ class Honeybee < FmRest::Spyke::Base
|
|
257
345
|
end
|
258
346
|
```
|
259
347
|
|
260
|
-
In this case you can pass the [`fmrest_config`](#modelfmrest_config) hash as an
|
261
|
-
argument to `Base()`:
|
262
|
-
|
263
|
-
```ruby
|
264
|
-
class Honeybee < FmRest::Spyke::Base(host: "...", database: "...", username: "...", password: "...")
|
265
|
-
end
|
266
|
-
|
267
|
-
Honeybee.fmrest_config
|
268
|
-
# => { host: "...", database: "...", username: "...", password: "..." }
|
269
|
-
```
|
270
|
-
|
271
348
|
All of Spyke's basic ORM operations work:
|
272
349
|
|
273
350
|
```ruby
|
@@ -490,7 +567,7 @@ Honeybee.limit(10)
|
|
490
567
|
```
|
491
568
|
|
492
569
|
NOTE: You can also set a default limit value for a model class, see
|
493
|
-
[
|
570
|
+
[other notes on querying](#other-notes-on-querying).
|
494
571
|
|
495
572
|
You can also use `.limit` to set limits on portals:
|
496
573
|
|
@@ -662,15 +739,15 @@ the scope object:
|
|
662
739
|
Honeybee.limit(10).sort(:name).find_some # => [<Honeybee...>, ...]
|
663
740
|
```
|
664
741
|
|
665
|
-
If you want just a single result you can use `.
|
742
|
+
If you want just a single result you can use `.first` instead (this will
|
666
743
|
force `.limit(1)`):
|
667
744
|
|
668
745
|
```ruby
|
669
|
-
Honeybee.query(name: "Hutch").
|
746
|
+
Honeybee.query(name: "Hutch").first # => <Honeybee...>
|
670
747
|
```
|
671
748
|
|
672
749
|
If you know the id of the record you should use `.find(id)` instead of
|
673
|
-
`.query(id: id).
|
750
|
+
`.query(id: id).first` (so that the sent request is
|
674
751
|
`GET ../:layout/records/:id` instead of `POST ../:layout/_find`).
|
675
752
|
|
676
753
|
```ruby
|
@@ -681,6 +758,52 @@ Note also that if you use `.find(id)` your `.query()` parameters (as well as
|
|
681
758
|
limit, offset and sort parameters) will be discarded as they're not supported
|
682
759
|
by the single record endpoint.
|
683
760
|
|
761
|
+
|
762
|
+
### Finding records in batches
|
763
|
+
|
764
|
+
Sometimes you want to iterate over a very large number of records to do some
|
765
|
+
processing, but requesting them all at once would result in one huge request to
|
766
|
+
the Data API, and loading too many records in memory all at once.
|
767
|
+
|
768
|
+
To mitigate this problem you can use `.find_in_batches` and `.find_each`. If
|
769
|
+
you've used ActiveRecord you're probably familiar with how they operate:
|
770
|
+
|
771
|
+
```ruby
|
772
|
+
# Find records in batches of 100 each
|
773
|
+
Honeybee.query(hive: "Queensville").find_in_batches(batch_size: 100) do |batch|
|
774
|
+
dispatch_bees(batch)
|
775
|
+
end
|
776
|
+
|
777
|
+
# Iterate over all records using batches
|
778
|
+
Honeybee.query(hive: "Queensville").find_each(batch_size: 100) do |bee|
|
779
|
+
bee.dispatch
|
780
|
+
end
|
781
|
+
```
|
782
|
+
|
783
|
+
`.find_in_batches` yields collections of records (batches), while `.find_each`
|
784
|
+
yields individual records, but using batches behind the scenes.
|
785
|
+
|
786
|
+
Both methods accept a block-less form in which case they return an
|
787
|
+
`Enumerator`:
|
788
|
+
|
789
|
+
```ruby
|
790
|
+
batch_enum = Honeybee.find_in_batches
|
791
|
+
|
792
|
+
batch = batch_enum.next # => Spyke::Collection
|
793
|
+
|
794
|
+
batch_enum.each do |batch|
|
795
|
+
process_batch(batch)
|
796
|
+
end
|
797
|
+
|
798
|
+
record_enum = Honeybee.find_each
|
799
|
+
|
800
|
+
record_enum.next # => Honeybee
|
801
|
+
```
|
802
|
+
|
803
|
+
NOTE: By its nature, batch processing is subject to race conditions if other
|
804
|
+
processes are modifying the database.
|
805
|
+
|
806
|
+
|
684
807
|
### Container fields
|
685
808
|
|
686
809
|
You can define container fields on your model class with `container`:
|
@@ -718,6 +841,7 @@ bee.photo.upload(filename_or_io) # Upload a file to the container
|
|
718
841
|
* `:content_type` - The MIME content type to use (defaults to
|
719
842
|
`application/octet-stream`)
|
720
843
|
|
844
|
+
|
721
845
|
### Script execution
|
722
846
|
|
723
847
|
The Data API allows running scripts as part of many types of requests.
|
@@ -805,7 +929,7 @@ separately, under their matching key.
|
|
805
929
|
```ruby
|
806
930
|
bee.save(script: { presort: "My Presort Script", after: "My Script" })
|
807
931
|
|
808
|
-
Honeybee.last_request_metadata
|
932
|
+
Honeybee.last_request_metadata.script
|
809
933
|
# => { after: { result: "oh hi", error: "0" }, presort: { result: "lo", error: "0" } }
|
810
934
|
```
|
811
935
|
|
@@ -819,7 +943,7 @@ is performed on that scope.
|
|
819
943
|
|
820
944
|
```ruby
|
821
945
|
# Find one Honeybee record executing a presort and after script
|
822
|
-
Honeybee.script(presort: ["My Presort Script", "parameter"], after: "My Script").
|
946
|
+
Honeybee.script(presort: ["My Presort Script", "parameter"], after: "My Script").first
|
823
947
|
```
|
824
948
|
|
825
949
|
The model class' `.last_request_metadata` will be set in case you need to get the result.
|
@@ -830,6 +954,33 @@ same metadata hash with script execution results. Note that this does not apply
|
|
830
954
|
to retrieving single records, in that case you'll have to use
|
831
955
|
`.last_request_metadata`.
|
832
956
|
|
957
|
+
|
958
|
+
### Setting global field values
|
959
|
+
|
960
|
+
You can call `.set_globals` on any `FmRest::Spyke::Base` model to set glabal
|
961
|
+
field values on the database that model is configured for.
|
962
|
+
|
963
|
+
You can pass it either a hash of fully qualified field names
|
964
|
+
(table_name::field_name), or 1-level-deep nested hashes, with the outer being a
|
965
|
+
table name and the inner keys being the field names:
|
966
|
+
|
967
|
+
```ruby
|
968
|
+
Honeybee.set_globals(
|
969
|
+
"beeTable::myVar" => "value",
|
970
|
+
"beeTable::myOtherVar" => "also a value"
|
971
|
+
)
|
972
|
+
|
973
|
+
# Equivalent to the above example
|
974
|
+
Honeybee.set_globals(beeTable: { myVar: "value", myOtherVar: "also a value" })
|
975
|
+
|
976
|
+
# Combined
|
977
|
+
Honeybee.set_globals(
|
978
|
+
"beeTable::myVar" => "value",
|
979
|
+
beeTable: { myOtherVar: "also a value" }
|
980
|
+
)
|
981
|
+
```
|
982
|
+
|
983
|
+
|
833
984
|
## Logging
|
834
985
|
|
835
986
|
If using fmrest-ruby + Spyke in a Rails app pretty log output will be set up
|
@@ -883,7 +1034,7 @@ FM Data API reference: https://fmhelp.filemaker.com/docs/18/en/dataapi/
|
|
883
1034
|
| Log in using OAuth | No | No |
|
884
1035
|
| Log in to an external data source | No | No |
|
885
1036
|
| Log in using a FileMaker ID account | No | No |
|
886
|
-
| Log out | Yes | Yes
|
1037
|
+
| Log out | Yes | Yes |
|
887
1038
|
| Get product information | Manual* | No |
|
888
1039
|
| Get database names | Manual* | No |
|
889
1040
|
| Get script names | Manual* | No |
|
@@ -898,25 +1049,12 @@ FM Data API reference: https://fmhelp.filemaker.com/docs/18/en/dataapi/
|
|
898
1049
|
| Get container data | Manual* | Yes |
|
899
1050
|
| Upload container data | Manual* | Yes |
|
900
1051
|
| Perform a find request | Manual* | Yes |
|
901
|
-
| Set global field values | Manual* |
|
1052
|
+
| Set global field values | Manual* | Yes
|
902
1053
|
| Run a script | Manual* | Yes |
|
903
1054
|
| Run a script with another request | Manual* | Yes |
|
904
1055
|
|
905
1056
|
\* You can manually supply the URL and JSON to a `FmRest` connection.
|
906
1057
|
|
907
|
-
## TODO
|
908
|
-
|
909
|
-
- [ ] Support for FM18 features
|
910
|
-
- [ ] Better/simpler-to-use core Ruby API
|
911
|
-
- [ ] Better API documentation and README
|
912
|
-
- [ ] Oauth support
|
913
|
-
- [x] Support for portal limit and offset
|
914
|
-
- [x] More options for token storage
|
915
|
-
- [x] Support for container fields
|
916
|
-
- [x] Optional logging
|
917
|
-
- [x] FmRest::Spyke::Base class for single inheritance (as alternative for mixin)
|
918
|
-
- [x] Specs
|
919
|
-
- [x] Support for portal data
|
920
1058
|
|
921
1059
|
## Gem development
|
922
1060
|
|
@@ -931,6 +1069,7 @@ release a new version, update the version number in `version.rb`, and then run
|
|
931
1069
|
git commits and tags, and push the `.gem` file to
|
932
1070
|
[rubygems.org](https://rubygems.org).
|
933
1071
|
|
1072
|
+
|
934
1073
|
## Contributing
|
935
1074
|
|
936
1075
|
Bug reports and pull requests are welcome. This project is intended to be a
|
@@ -938,20 +1077,16 @@ safe, welcoming space for collaboration, and contributors are expected to
|
|
938
1077
|
adhere to the [Contributor Covenant](http://contributor-covenant.org) code of
|
939
1078
|
conduct.
|
940
1079
|
|
1080
|
+
|
941
1081
|
## License
|
942
1082
|
|
943
1083
|
The gem is available as open source under the terms of the
|
944
1084
|
[MIT License](https://opensource.org/licenses/MIT).
|
945
1085
|
See [LICENSE.txt](LICENSE.txt).
|
946
1086
|
|
1087
|
+
|
947
1088
|
## Disclaimer
|
948
1089
|
|
949
1090
|
This project is not sponsored by or otherwise affiliated with FileMaker, Inc,
|
950
1091
|
an Apple subsidiary. FileMaker is a trademark of FileMaker, Inc., registered in
|
951
1092
|
the U.S. and other countries.
|
952
|
-
|
953
|
-
## Code of Conduct
|
954
|
-
|
955
|
-
Everyone interacting in the fmrest-ruby project’s codebases, issue trackers,
|
956
|
-
chat rooms and mailing lists is expected to follow the [code of
|
957
|
-
conduct](CODE_OF_CONDUCT.md).
|
data/lib/fmrest/spyke.rb
CHANGED
data/lib/fmrest/spyke/base.rb
CHANGED
@@ -8,6 +8,8 @@ module FmRest
|
|
8
8
|
|
9
9
|
class << self
|
10
10
|
def Base(config = nil)
|
11
|
+
warn "[DEPRECATION] Inheriting from `FmRest::Spyke::Base(config)` is deprecated and will be removed, inherit from `FmRest::Spyke::Base` (without arguments) and use `fmrest_config=` instead"
|
12
|
+
|
11
13
|
if config
|
12
14
|
return Class.new(::FmRest::Spyke::Base) do
|
13
15
|
self.fmrest_config = config
|
data/lib/fmrest/spyke/model.rb
CHANGED
@@ -7,6 +7,7 @@ require "fmrest/spyke/model/serialization"
|
|
7
7
|
require "fmrest/spyke/model/associations"
|
8
8
|
require "fmrest/spyke/model/orm"
|
9
9
|
require "fmrest/spyke/model/container_fields"
|
10
|
+
require "fmrest/spyke/model/global_fields"
|
10
11
|
require "fmrest/spyke/model/http"
|
11
12
|
require "fmrest/spyke/model/auth"
|
12
13
|
|
@@ -22,6 +23,7 @@ module FmRest
|
|
22
23
|
include Associations
|
23
24
|
include Orm
|
24
25
|
include ContainerFields
|
26
|
+
include GlobalFields
|
25
27
|
include Http
|
26
28
|
include Auth
|
27
29
|
|
@@ -10,7 +10,7 @@ module FmRest
|
|
10
10
|
|
11
11
|
included do
|
12
12
|
# Keep track of portal options by their FM keys as we could need it
|
13
|
-
# to parse the portalData JSON in
|
13
|
+
# to parse the portalData JSON in SpykeFormatter
|
14
14
|
class_attribute :portal_options, instance_accessor: false, instance_predicate: false
|
15
15
|
|
16
16
|
# class_attribute supports a :default option since ActiveSupport 5.2,
|
@@ -37,7 +37,7 @@ module FmRest
|
|
37
37
|
def has_portal(name, options = {})
|
38
38
|
create_association(name, Portal, options)
|
39
39
|
|
40
|
-
# Store options for
|
40
|
+
# Store options for SpykeFormatter to use if needed
|
41
41
|
portal_key = options[:portal_key] || name
|
42
42
|
self.portal_options = portal_options.merge(portal_key.to_s => options.dup.merge(name: name.to_s)).freeze
|
43
43
|
|
@@ -4,10 +4,19 @@ module FmRest
|
|
4
4
|
module Spyke
|
5
5
|
module Model
|
6
6
|
module Connection
|
7
|
-
extend
|
7
|
+
extend ActiveSupport::Concern
|
8
8
|
|
9
9
|
included do
|
10
|
-
class_attribute :fmrest_config,
|
10
|
+
class_attribute :fmrest_config, instance_writer: false, instance_predicate: false
|
11
|
+
|
12
|
+
# Overrides the fmrest_config reader created by class_attribute so we
|
13
|
+
# can default set the default at call time.
|
14
|
+
#
|
15
|
+
# This method gets overwriten in subclasses if self.fmrest_config= is
|
16
|
+
# called.
|
17
|
+
define_singleton_method(:fmrest_config) do
|
18
|
+
FmRest.default_connection_settings
|
19
|
+
end
|
11
20
|
|
12
21
|
class_attribute :faraday_block, instance_accessor: false, instance_predicate: false
|
13
22
|
class << self; private :faraday_block, :faraday_block=; end
|
@@ -38,15 +47,25 @@ module FmRest
|
|
38
47
|
private
|
39
48
|
|
40
49
|
def fmrest_connection
|
41
|
-
@fmrest_connection ||=
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
+
@fmrest_connection ||=
|
51
|
+
begin
|
52
|
+
config = fmrest_config
|
53
|
+
|
54
|
+
FmRest::V1.build_connection(config) do |conn|
|
55
|
+
faraday_block.call(conn) if faraday_block
|
56
|
+
|
57
|
+
# Pass the class to SpykeFormatter's initializer so it can have
|
58
|
+
# access to extra context defined in the model, e.g. a portal
|
59
|
+
# where name of the portal and the attributes prefix don't match
|
60
|
+
# and need to be specified as options to `portal`
|
61
|
+
conn.use FmRest::Spyke::SpykeFormatter, self
|
62
|
+
|
63
|
+
conn.use FmRest::V1::TypeCoercer, config
|
64
|
+
|
65
|
+
# FmRest::Spyke::JsonParse expects symbol keys
|
66
|
+
conn.response :json, parser_options: { symbolize_names: true }
|
67
|
+
end
|
68
|
+
end
|
50
69
|
end
|
51
70
|
end
|
52
71
|
end
|