consyncful 0.3.3 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 35970feb7c2d47cbe63b05842f6942f5cf5d8f6a4e55d2802b09672b5e83174d
4
- data.tar.gz: 49ffee729075860cf9ce4d3bf07fefad84a4fa6d62283c6c49418fb39749ea48
3
+ metadata.gz: 5798e871965ab5ca699b12f71a397ef37025d75547786ea804e1c38a9b0091ac
4
+ data.tar.gz: abfc466d422b44adc07abdc2d1b6bc36ff6e3dde8b57006d856bd809aaae86d5
5
5
  SHA512:
6
- metadata.gz: aafcfc21b21ae872d3ff94e8540ea9d544785eb5fc989a2097fd97289bc46b80c4c965eac1c05d9b80a9e073e58dfa252363c5d5bf0377d3668a4a991b397de7
7
- data.tar.gz: b872d49812bdad638f320a67f85d7809b6c17ab4421149247155b0c8961befb8394d4fc973b5a6c99166b928672867ddcf219e723d0833867980a284efac051f
6
+ metadata.gz: 8dbb9580e3aaa1aee124608323d877ab21f89da591976394bedd69c400682f88714b83598a14bacf32c18987089bfd84225273d2c868a4c17a033bb366c0ff3d
7
+ data.tar.gz: e3dc1aaf34278f60014f30c7f6487ba4558a7a0c9810ece3b44ee61e387a2036e52bb4eeb8955a94297a800f87ee2f6a5dedc85e26fc24d3e1bc91e256a6fbe7
data/Gemfile.lock CHANGED
@@ -1,39 +1,42 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- consyncful (0.3.3)
4
+ consyncful (0.4.0)
5
5
  contentful (>= 2.11.1, < 3.0.0)
6
+ hooks (>= 0.4.1)
6
7
  mongoid (>= 7.0.2, < 8.0.0)
7
8
  rainbow
8
9
 
9
10
  GEM
10
11
  remote: https://rubygems.org/
11
12
  specs:
12
- activemodel (6.0.2.1)
13
- activesupport (= 6.0.2.1)
14
- activesupport (6.0.2.1)
13
+ activemodel (6.0.3.4)
14
+ activesupport (= 6.0.3.4)
15
+ activesupport (6.0.3.4)
15
16
  concurrent-ruby (~> 1.0, >= 1.0.2)
16
17
  i18n (>= 0.7, < 2)
17
18
  minitest (~> 5.1)
18
19
  tzinfo (~> 1.1)
19
- zeitwerk (~> 2.2)
20
+ zeitwerk (~> 2.2, >= 2.2.2)
20
21
  addressable (2.7.0)
21
22
  public_suffix (>= 2.0.2, < 5.0)
22
23
  ast (2.4.0)
23
- bson (4.8.2)
24
- concurrent-ruby (1.1.6)
25
- contentful (2.15.2)
24
+ bson (4.11.1)
25
+ concurrent-ruby (1.1.8)
26
+ contentful (2.15.4)
26
27
  http (> 0.8, < 5.0)
27
28
  multi_json (~> 1)
28
29
  database_cleaner (1.8.3)
29
30
  diff-lcs (1.3)
30
31
  domain_name (0.5.20190701)
31
32
  unf (>= 0.0.5, < 1.0.0)
32
- ffi (1.12.2)
33
+ ffi (1.14.2)
33
34
  ffi-compiler (1.0.1)
34
35
  ffi (>= 1.0.0)
35
36
  rake
36
- http (4.3.0)
37
+ hooks (0.4.1)
38
+ uber (~> 0.0.14)
39
+ http (4.4.1)
37
40
  addressable (~> 2.3)
38
41
  http-cookie (~> 1.0)
39
42
  http-form_data (~> 2.2)
@@ -41,22 +44,22 @@ GEM
41
44
  http-cookie (1.0.3)
42
45
  domain_name (~> 0.5)
43
46
  http-form_data (2.3.0)
44
- http-parser (1.2.1)
47
+ http-parser (1.2.3)
45
48
  ffi-compiler (>= 1.0, < 2.0)
46
- i18n (1.8.2)
49
+ i18n (1.8.7)
47
50
  concurrent-ruby (~> 1.0)
48
51
  jaro_winkler (1.5.4)
49
- minitest (5.14.0)
50
- mongo (2.11.4)
51
- bson (>= 4.4.2, < 5.0.0)
52
- mongoid (7.1.0)
52
+ minitest (5.14.3)
53
+ mongo (2.14.0)
54
+ bson (>= 4.8.2, < 5.0.0)
55
+ mongoid (7.2.0)
53
56
  activemodel (>= 5.1, < 6.1)
54
- mongo (>= 2.7.0, < 3.0.0)
55
- multi_json (1.14.1)
57
+ mongo (>= 2.10.5, < 3.0.0)
58
+ multi_json (1.15.0)
56
59
  parallel (1.19.1)
57
60
  parser (2.7.0.2)
58
61
  ast (~> 2.4.0)
59
- public_suffix (4.0.3)
62
+ public_suffix (4.0.6)
60
63
  rainbow (3.0.0)
61
64
  rake (13.0.1)
62
65
  rspec (3.9.0)
@@ -81,13 +84,14 @@ GEM
81
84
  unicode-display_width (>= 1.4.0, < 1.7)
82
85
  ruby-progressbar (1.10.1)
83
86
  thread_safe (0.3.6)
84
- tzinfo (1.2.6)
87
+ tzinfo (1.2.9)
85
88
  thread_safe (~> 0.1)
89
+ uber (0.0.15)
86
90
  unf (0.1.4)
87
91
  unf_ext
88
- unf_ext (0.0.7.6)
92
+ unf_ext (0.0.7.7)
89
93
  unicode-display_width (1.6.1)
90
- zeitwerk (2.3.0)
94
+ zeitwerk (2.4.2)
91
95
 
92
96
  PLATFORMS
93
97
  ruby
data/README.md CHANGED
@@ -134,6 +134,24 @@ Because all contentful models are stored as polymorphic subtypes of Consyncful::
134
134
  Consyncful::Base.where(title: 'a title') # [ #<ModelName>, #<OtherModelName> ]
135
135
  ```
136
136
 
137
+ ### Sync callbacks
138
+
139
+ You may want to attach some application logic to happen before or after a sync run, for example to update caches or something.
140
+
141
+ Callbacks can be registered using:
142
+
143
+ ```ruby
144
+ Consyncful::Sync.before_run do
145
+ # do something before the run
146
+ end
147
+ ```
148
+
149
+ ```ruby
150
+ Consyncful::Sync.after_run do |updated_ids|
151
+ # invalidate cache for updated_ids, or something
152
+ end
153
+ ```
154
+
137
155
  ## Limitations
138
156
 
139
157
  ### Locales
data/consyncful.gemspec CHANGED
@@ -37,6 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency 'rubocop', '0.79.0'
38
38
 
39
39
  spec.add_dependency 'contentful', ['>=2.11.1', '<3.0.0']
40
+ spec.add_dependency 'hooks', '>=0.4.1'
40
41
  spec.add_dependency 'mongoid', ['>=7.0.2', '<8.0.0']
41
42
  spec.add_dependency 'rainbow'
42
43
  end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Consyncful
4
+ # Takes a mapped item from contentful and applies it to the local storage.
5
+ class PersistedItem
6
+ DEFAULT_LOCALE = 'en-NZ'
7
+
8
+ def initialize(item, sync_id, stats)
9
+ @item = item
10
+ @sync_id = sync_id
11
+ @stats = stats
12
+ end
13
+
14
+ def persist
15
+ puts Rainbow("syncing: #{@item.id}").yellow
16
+ if @item.deletion?
17
+ delete_model(@item.id, @stats)
18
+ else
19
+ create_or_update_model(@item, @sync_id, @stats)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def delete_model(id, stats)
26
+ Base.find_by(id: id).destroy
27
+ stats.record_deleted
28
+ rescue Mongoid::Errors::DocumentNotFound
29
+ puts Rainbow("Deleted record not found: #{id}").yellow
30
+ nil
31
+ end
32
+
33
+ def create_or_update_model(item, sync_id, stats)
34
+ return if item.type.nil?
35
+
36
+ instance = find_or_initialize_item(item)
37
+ update_stats(instance, stats)
38
+
39
+ reset_fields(instance)
40
+
41
+ item.mapped_fields(DEFAULT_LOCALE).each do |field, value|
42
+ instance[field] = value
43
+ end
44
+
45
+ instance[:sync_id] = sync_id
46
+
47
+ instance.save
48
+ end
49
+
50
+ def find_or_initialize_item(item)
51
+ model_class(item.type).find_or_initialize_by(id: item.id)
52
+ end
53
+
54
+ def update_stats(instance, stats)
55
+ if instance.persisted?
56
+ stats.record_updated
57
+ else
58
+ stats.record_added
59
+ end
60
+ end
61
+
62
+ def model_class(type)
63
+ Base.model_map[type] || Base
64
+ end
65
+
66
+ def reset_fields(instance)
67
+ instance.attributes.each do |field_name, _value|
68
+ next if field_name.in? %w[_id _type]
69
+
70
+ instance[field_name] = nil
71
+ end
72
+ end
73
+ end
74
+ end
@@ -2,11 +2,17 @@
2
2
 
3
3
  require 'rainbow'
4
4
  require 'consyncful/item_mapper'
5
+ require 'consyncful/persisted_item'
5
6
  require 'consyncful/stats'
7
+ require 'hooks'
6
8
 
7
9
  module Consyncful
8
10
  class Sync
9
11
  include Mongoid::Document
12
+ include Hooks
13
+
14
+ define_hook :before_run
15
+ define_hook :after_run
10
16
 
11
17
  DEFAULT_LOCALE = 'en-NZ'
12
18
 
@@ -29,19 +35,21 @@ module Consyncful
29
35
  end
30
36
 
31
37
  def run
38
+ run_hook :before_run
39
+
32
40
  stats = Consyncful::Stats.new
33
41
  load_all_models
34
42
 
35
43
  sync = start_sync
36
44
 
37
- sync_items(sync, stats)
45
+ changed_ids = sync_items(sync, stats)
38
46
 
39
47
  drop_stale
40
48
 
41
- self.next_url = sync.next_sync_url
42
- self.last_run_at = Time.current
43
- save
49
+ update_run(sync.next_sync_url)
44
50
  stats.print_stats
51
+
52
+ run_hook :after_run, changed_ids
45
53
  end
46
54
 
47
55
  private
@@ -52,6 +60,12 @@ module Consyncful
52
60
  Rails.application.eager_load!
53
61
  end
54
62
 
63
+ def update_run(next_url)
64
+ self.next_url = next_url
65
+ self.last_run_at = Time.current
66
+ save
67
+ end
68
+
55
69
  def start_sync
56
70
  if next_url.present?
57
71
  puts Rainbow("Starting update, last update: #{last_run_at} (#{(Time.current - last_run_at).round(3)}s ago)").blue
@@ -63,69 +77,19 @@ module Consyncful
63
77
  end
64
78
 
65
79
  def sync_items(sync, stats)
80
+ ids = []
66
81
  sync.each_page do |page|
67
82
  page.items.each do |item|
68
- sync_item(ItemMapper.new(item), stats)
83
+ ids << sync_item(ItemMapper.new(item), stats)
69
84
  end
70
85
  end
86
+ ids
71
87
  end
72
88
 
73
89
  def sync_item(item, stats)
74
90
  puts Rainbow("syncing: #{item.id}").yellow
75
- if item.deletion?
76
- delete_model(item.id, stats)
77
- else
78
- create_or_update_model(item, stats)
79
- end
80
- end
81
-
82
- def delete_model(id, stats)
83
- Base.find_by(id: id).destroy
84
- stats.record_deleted
85
- rescue Mongoid::Errors::DocumentNotFound
86
- puts Rainbow("Deleted record not found: #{id}").yellow
87
- nil
88
- end
89
-
90
- def create_or_update_model(item, stats)
91
- return if item.type.nil?
92
-
93
- instance = find_or_initialize_item(item)
94
- update_stats(instance, stats)
95
-
96
- reset_fields(instance)
97
-
98
- item.mapped_fields(DEFAULT_LOCALE).each do |field, value|
99
- instance[field] = value
100
- end
101
-
102
- instance[:sync_id] = id
103
-
104
- instance.save
105
- end
106
-
107
- def find_or_initialize_item(item)
108
- model_class(item.type).find_or_initialize_by(id: item.id)
109
- end
110
-
111
- def update_stats(instance, stats)
112
- if instance.persisted?
113
- stats.record_updated
114
- else
115
- stats.record_added
116
- end
117
- end
118
-
119
- def model_class(type)
120
- Base.model_map[type] || Base
121
- end
122
-
123
- def reset_fields(instance)
124
- instance.attributes.each do |field_name, _value|
125
- next if field_name.in? %w[_id _type]
126
-
127
- instance[field_name] = nil
128
- end
91
+ PersistedItem.new(item, id, stats).persist
92
+ item.id
129
93
  end
130
94
  end
131
95
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Consyncful
4
- VERSION = '0.3.3'
4
+ VERSION = '0.4.0'
5
5
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: consyncful
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Anastasiadis-Gray
8
8
  - Montgomery Anderson
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-03-16 00:00:00.000000000 Z
12
+ date: 2021-02-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -101,6 +101,20 @@ dependencies:
101
101
  - - "<"
102
102
  - !ruby/object:Gem::Version
103
103
  version: 3.0.0
104
+ - !ruby/object:Gem::Dependency
105
+ name: hooks
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 0.4.1
111
+ type: :runtime
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 0.4.1
104
118
  - !ruby/object:Gem::Dependency
105
119
  name: mongoid
106
120
  requirement: !ruby/object:Gem::Requirement
@@ -135,7 +149,7 @@ dependencies:
135
149
  - - ">="
136
150
  - !ruby/object:Gem::Version
137
151
  version: '0'
138
- description:
152
+ description:
139
153
  email:
140
154
  - andy@boost.co.nz
141
155
  - montgomery@boost.co.nz
@@ -162,6 +176,7 @@ files:
162
176
  - lib/consyncful.rb
163
177
  - lib/consyncful/base.rb
164
178
  - lib/consyncful/item_mapper.rb
179
+ - lib/consyncful/persisted_item.rb
165
180
  - lib/consyncful/railtie.rb
166
181
  - lib/consyncful/stats.rb
167
182
  - lib/consyncful/sync.rb
@@ -171,7 +186,7 @@ homepage: https://github.com/boost/consyncful
171
186
  licenses:
172
187
  - MIT
173
188
  metadata: {}
174
- post_install_message:
189
+ post_install_message:
175
190
  rdoc_options: []
176
191
  require_paths:
177
192
  - lib
@@ -186,9 +201,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
201
  - !ruby/object:Gem::Version
187
202
  version: '0'
188
203
  requirements: []
189
- rubyforge_project:
204
+ rubyforge_project:
190
205
  rubygems_version: 2.7.6.2
191
- signing_key:
206
+ signing_key:
192
207
  specification_version: 4
193
208
  summary: Contentful to local database synchronisation for Rails
194
209
  test_files: []