synced 1.5.2 → 1.6.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/README.md +17 -0
- data/lib/synced/model.rb +11 -3
- data/lib/synced/strategies/full.rb +22 -8
- data/lib/synced/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a79202a122c1ac89d94317b7a04ddcc4cbd2f826
|
4
|
+
data.tar.gz: 9a24cb9fa5f708ead2375829a1a615588d1dc9e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9be1f7c897d14a222d99dd2ba3392fa637af8b56432b82078aa26ef59c5914ec412e2b3fb29e3582d03c2881f8a6383d7f0dccdc1d5369b9b044c3aac54f2728
|
7
|
+
data.tar.gz: 970a8062422cd80b92d69d7f2d82f82c14ccbabefad4aa8ce9659aace797ae4be06cae49a58458649d1499ff6f08b2ea982d127a732f822afc8dbe043df2d113
|
data/README.md
CHANGED
@@ -462,6 +462,22 @@ keys are delegated attributes' names and values are keys on synced data Hash. Th
|
|
462
462
|
version of `delegate :name, to: :synced_data` which works with Hash reserved attributes names, like
|
463
463
|
`:zip`, `:map`.
|
464
464
|
|
465
|
+
## Persisting fetched objects
|
466
|
+
|
467
|
+
By default all fetched objects are persisted inside one big transaction. You can customize this behaviour by providing `transaction_per_page` option either in model configuration:
|
468
|
+
|
469
|
+
```ruby
|
470
|
+
class Photo < ActiveRecord::Base
|
471
|
+
synced transaction_per_page: true
|
472
|
+
end
|
473
|
+
```
|
474
|
+
|
475
|
+
Or as a param in `synchronize` method:
|
476
|
+
|
477
|
+
```
|
478
|
+
Photo.synchronize(transaction_per_page: true)
|
479
|
+
```
|
480
|
+
|
465
481
|
## Synced configuration options
|
466
482
|
|
467
483
|
Option name | Default value | Description | synced | synchronize |
|
@@ -477,6 +493,7 @@ Option name | Default value | Description
|
|
477
493
|
`:remote` | `nil` | [Remote objects to be synchronized with local ones](#synchronization-of-given-remote-objects) | NO | YES |
|
478
494
|
`:delegate_attributes`| `[]` | [Define delegators to synced data Hash attributes](#delegate-attributes) | YES | NO |
|
479
495
|
`:auto_paginate` | `true` | [Whether data should be fetched in batches or as one response](#fetching-methods) | YES | YES |
|
496
|
+
`:transaction_per_page` | `false` | [Whether transaction should be per page of fetched objects or for all the pages - note that setting this value to `true` will mean always fetching data in batches, even when specifying `auto_paginate` as true](#persisting-fetched-objects) | YES | YES |
|
480
497
|
`:handle_processed_objects_proc` | `nil` | [Custom proc taking persisted remote objects, called after persisting batch of data](#persisted-objects) | YES | NO |
|
481
498
|
|
482
499
|
## Documentation
|
data/lib/synced/model.rb
CHANGED
@@ -37,17 +37,20 @@ module Synced
|
|
37
37
|
# which will be passed to api client to perform search
|
38
38
|
# @option options [Boolean] auto_paginate: If true (default) will fetch and save all
|
39
39
|
# records at once. If false will fetch and save records in batches.
|
40
|
+
# @option options transaction_per_page [Boolean]: If false (default) all fetched records
|
41
|
+
# will be persisted within single transaction. If true the transaction will be per page
|
42
|
+
# of fetched records
|
40
43
|
# @option options [Proc] handle_processed_objects_proc: Proc taking one argument (persisted remote objects).
|
41
44
|
# Called after persisting remote objects (once in case of auto_paginate, after each batch
|
42
45
|
# when paginating with block).
|
43
46
|
def synced(strategy: :updated_since, **options)
|
44
47
|
options.assert_valid_keys(:associations, :data_key, :fields,
|
45
48
|
:globalized_attributes, :id_key, :include, :initial_sync_since,
|
46
|
-
:local_attributes, :mapper, :only_updated, :remove, :auto_paginate,
|
49
|
+
:local_attributes, :mapper, :only_updated, :remove, :auto_paginate, :transaction_per_page,
|
47
50
|
:delegate_attributes, :query_params, :timestamp_strategy, :handle_processed_objects_proc)
|
48
51
|
class_attribute :synced_id_key, :synced_data_key,
|
49
52
|
:synced_local_attributes, :synced_associations, :synced_only_updated,
|
50
|
-
:synced_mapper, :synced_remove, :synced_include, :synced_fields, :synced_auto_paginate,
|
53
|
+
:synced_mapper, :synced_remove, :synced_include, :synced_fields, :synced_auto_paginate, :synced_transaction_per_page,
|
51
54
|
:synced_globalized_attributes, :synced_initial_sync_since, :synced_delegate_attributes,
|
52
55
|
:synced_query_params, :synced_timestamp_strategy, :synced_strategy, :synced_handle_processed_objects_proc
|
53
56
|
self.synced_strategy = strategy
|
@@ -69,6 +72,7 @@ module Synced
|
|
69
72
|
self.synced_query_params = options.fetch(:query_params, {})
|
70
73
|
self.synced_timestamp_strategy = options.fetch(:timestamp_strategy, nil)
|
71
74
|
self.synced_auto_paginate = options.fetch(:auto_paginate, true)
|
75
|
+
self.synced_transaction_per_page = options.fetch(:transaction_per_page, false)
|
72
76
|
self.synced_handle_processed_objects_proc = options.fetch(:handle_processed_objects_proc, nil)
|
73
77
|
include Synced::DelegateAttributes
|
74
78
|
include Synced::HasSyncedData
|
@@ -93,6 +97,9 @@ module Synced
|
|
93
97
|
# and then overwritten in the synchronize method.
|
94
98
|
# @param auto_paginate [Boolean] - If true (default) will fetch and save all
|
95
99
|
# records at once. If false will fetch and save records in batches.
|
100
|
+
# @param transaction_per_page [Boolean] - If false (default) all fetched records
|
101
|
+
# will be persisted within single transaction. If true the transaction will be per page
|
102
|
+
# of fetched records
|
96
103
|
# @param api [BookingSync::API::Client] - API client to be used for fetching
|
97
104
|
# remote objects
|
98
105
|
# @example Synchronizing amenities
|
@@ -106,12 +113,13 @@ module Synced
|
|
106
113
|
# website.rentals.synchronize(remote: remote_rentals)
|
107
114
|
#
|
108
115
|
def synchronize(scope: scope_from_relation, strategy: synced_strategy, **options)
|
109
|
-
options.assert_valid_keys(:api, :fields, :include, :remote, :remove, :query_params, :association_sync, :auto_paginate)
|
116
|
+
options.assert_valid_keys(:api, :fields, :include, :remote, :remove, :query_params, :association_sync, :auto_paginate, :transaction_per_page)
|
110
117
|
options[:remove] = synced_remove unless options.has_key?(:remove)
|
111
118
|
options[:include] = Array.wrap(synced_include) unless options.has_key?(:include)
|
112
119
|
options[:fields] = Array.wrap(synced_fields) unless options.has_key?(:fields)
|
113
120
|
options[:query_params] = synced_query_params unless options.has_key?(:query_params)
|
114
121
|
options[:auto_paginate] = synced_auto_paginate unless options.has_key?(:auto_paginate)
|
122
|
+
options[:transaction_per_page] = synced_transaction_per_page unless options.has_key?(:transaction_per_page)
|
115
123
|
options.merge!({
|
116
124
|
scope: scope,
|
117
125
|
strategy: strategy,
|
@@ -44,6 +44,9 @@ module Synced
|
|
44
44
|
# which will be mapped with their translations.
|
45
45
|
# @option options [Boolean] auto_paginate: If true (default) will fetch and save all
|
46
46
|
# records at once. If false will fetch and save records in batches.
|
47
|
+
# @options options [Boolean] transaction_per_page: if false (default) all fetched records
|
48
|
+
# will be persisted within single transaction. If true the transaction will be per page
|
49
|
+
# of fetched records
|
47
50
|
def initialize(model_class, options = {})
|
48
51
|
@model_class = model_class
|
49
52
|
@scope = options[:scope]
|
@@ -64,21 +67,22 @@ module Synced
|
|
64
67
|
@globalized_attributes = synced_attributes_as_hash(options[:globalized_attributes])
|
65
68
|
@query_params = options[:query_params]
|
66
69
|
@auto_paginate = options[:auto_paginate]
|
70
|
+
@transaction_per_page = options[:transaction_per_page]
|
67
71
|
@handle_processed_objects_proc = options[:handle_processed_objects_proc]
|
68
72
|
@remote_objects_ids = []
|
69
73
|
end
|
70
74
|
|
71
75
|
def perform
|
72
76
|
instrument("perform.synced", model: @model_class) do
|
77
|
+
processed_objects = instrument("sync_perform.synced", model: @model_class) do
|
78
|
+
process_remote_objects(remote_objects_persistor)
|
79
|
+
end
|
73
80
|
relation_scope.transaction do
|
74
|
-
processed_objects = instrument("sync_perform.synced", model: @model_class) do
|
75
|
-
process_remote_objects(remote_objects_persistor)
|
76
|
-
end
|
77
81
|
instrument("remove_perform.synced", model: @model_class) do
|
78
82
|
remove_relation.send(remove_strategy) if @remove
|
79
83
|
end
|
80
|
-
processed_objects
|
81
84
|
end
|
85
|
+
processed_objects
|
82
86
|
end
|
83
87
|
end
|
84
88
|
|
@@ -193,11 +197,21 @@ module Synced
|
|
193
197
|
|
194
198
|
def fetch_and_save_remote_objects(processor)
|
195
199
|
instrument("fetch_remote_objects.synced", model: @model_class) do
|
196
|
-
if @
|
197
|
-
processor.call(api.paginate(resource_name, api_request_options))
|
198
|
-
else
|
200
|
+
if @transaction_per_page
|
199
201
|
api.paginate(resource_name, api_request_options) do |batch|
|
200
|
-
|
202
|
+
relation_scope.transaction do
|
203
|
+
processor.call(batch)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
elsif @auto_paginate
|
207
|
+
relation_scope.transaction do
|
208
|
+
processor.call(api.paginate(resource_name, api_request_options))
|
209
|
+
end
|
210
|
+
else
|
211
|
+
relation_scope.transaction do
|
212
|
+
api.paginate(resource_name, api_request_options) do |batch|
|
213
|
+
processor.call(batch)
|
214
|
+
end
|
201
215
|
end
|
202
216
|
end
|
203
217
|
end
|
data/lib/synced/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: synced
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastien Grosjean
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-06-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -238,8 +238,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
238
238
|
version: '0'
|
239
239
|
requirements: []
|
240
240
|
rubyforge_project:
|
241
|
-
rubygems_version: 2.
|
241
|
+
rubygems_version: 2.5.1
|
242
242
|
signing_key:
|
243
243
|
specification_version: 4
|
244
244
|
summary: Keep your BookingSync Application synced with BookingSync.
|
245
245
|
test_files: []
|
246
|
+
has_rdoc:
|