wcc-contentful 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 476f7c65f705c14e012e8c2cbb36f68e29782607377b0a4aa9d0c10fb93458da
4
- data.tar.gz: 01aeff71919acef51c8d498c63bc42e822ed3c598e7c636f5faf74baeb74c552
3
+ metadata.gz: 9026bfcc1e7745f7d8ecf3fb38928672f02d663d382fd1a3ca953ab33a78cb25
4
+ data.tar.gz: 36ec7c7f47fb6e49d565d7ca82c5021ac8f88b46eabfe41754ac5c123ac0004d
5
5
  SHA512:
6
- metadata.gz: '0383a5fe8ef8b042d0a9aca04c964051fc5201b89e702a80b616e5c3b36fd6fa7590d768d178e96f3353c998923fc87458697f5b1112bdd000e6e273fdb07f56'
7
- data.tar.gz: 776a6ec463edbcd209d28dd2033d6378ac45e44dd9bca790aefe81ea529c4fa4d0cf6725bd3f67e5c4054f41bd930e9905165f8ccd42f2a9f01b3bc0ac1deaf6
6
+ metadata.gz: 633116bd83752074876ccf76265eb64bc6a19a28b9a477bf2026925f0a84977cd651a234f5656b7a657a43e65b3320031e2385ca398bb2b846ab730693105799
7
+ data.tar.gz: 32f1f08bac98d42d89a136c0b49d2bb1ee1a72e057326edd50a17834b53b2da7fecbbe1db1aded355d2849bc1d222d4f16d3e721024a3c105f786349ab6548fc
@@ -10,6 +10,7 @@ class WCC::Contentful::Configuration
10
10
  default_locale
11
11
  environment
12
12
  instrumentation_adapter
13
+ logger
13
14
  management_token
14
15
  preview_token
15
16
  schema_file
@@ -182,6 +183,11 @@ class WCC::Contentful::Configuration
182
183
  # to :instrument like ActiveSupport::Notifications.instrument
183
184
  attr_accessor :instrumentation_adapter
184
185
 
186
+ # Sets the logger to be used by the wcc-contentful gem, including stores.
187
+ # Defaults to the rails logger if in a rails context, otherwise creates a new
188
+ # logger that writes to STDERR.
189
+ attr_accessor :logger
190
+
185
191
  def initialize
186
192
  @access_token = ENV.fetch('CONTENTFUL_ACCESS_TOKEN', nil)
187
193
  @app_url = ENV.fetch('APP_URL', nil)
@@ -132,6 +132,15 @@ module WCC::Contentful
132
132
  # Allow it to be injected into a store
133
133
  alias_method :_instrumentation, :instrumentation
134
134
 
135
+ # Gets the configured logger, defaulting to Rails.logger in a rails context,
136
+ # or logging to STDERR in a non-rails context.
137
+ def logger
138
+ @logger ||=
139
+ configuration.logger ||
140
+ (Rails.logger if defined?(Rails)) ||
141
+ Logger.new($stderr)
142
+ end
143
+
135
144
  ##
136
145
  # This method enables simple dependency injection -
137
146
  # If the target has a setter matching the name of one of the services,
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The CDN SimpleClient accesses 'https://cdn.contentful.com' to get raw
4
+ # JSON responses. It exposes methods to query entries, assets, and content_types.
5
+ # The responses are instances of WCC::Contentful::SimpleClient::Response
6
+ # which handles paging automatically.
7
+ #
8
+ # @api Client
9
+ class WCC::Contentful::SimpleClient::Cdn < WCC::Contentful::SimpleClient
10
+ def initialize(space:, access_token:, **options)
11
+ super(
12
+ api_url: options[:api_url] || 'https://cdn.contentful.com/',
13
+ space: space,
14
+ access_token: access_token,
15
+ **options
16
+ )
17
+ end
18
+
19
+ def client_type
20
+ 'cdn'
21
+ end
22
+
23
+ # Gets an entry by ID
24
+ def entry(key, query = {})
25
+ resp =
26
+ _instrument 'entries', id: key, type: 'Entry', query: query do
27
+ get("entries/#{key}", query)
28
+ end
29
+ resp.assert_ok!
30
+ end
31
+
32
+ # Queries entries with optional query parameters
33
+ def entries(query = {})
34
+ resp =
35
+ _instrument 'entries', type: 'Entry', query: query do
36
+ get('entries', query)
37
+ end
38
+ resp.assert_ok!
39
+ end
40
+
41
+ # Gets an asset by ID
42
+ def asset(key, query = {})
43
+ resp =
44
+ _instrument 'entries', type: 'Asset', id: key, query: query do
45
+ get("assets/#{key}", query)
46
+ end
47
+ resp.assert_ok!
48
+ end
49
+
50
+ # Queries assets with optional query parameters
51
+ def assets(query = {})
52
+ resp =
53
+ _instrument 'entries', type: 'Asset', query: query do
54
+ get('assets', query)
55
+ end
56
+ resp.assert_ok!
57
+ end
58
+
59
+ # Queries content types with optional query parameters
60
+ def content_types(query = {})
61
+ resp =
62
+ _instrument 'content_types', query: query do
63
+ get('content_types', query)
64
+ end
65
+ resp.assert_ok!
66
+ end
67
+
68
+ # Accesses the Sync API to get a list of items that have changed since
69
+ # the last sync. Accepts a block that receives each changed item, and returns
70
+ # the next sync token.
71
+ #
72
+ # If `sync_token` is nil, an initial sync is performed.
73
+ #
74
+ # @return String the next sync token parsed from nextSyncUrl
75
+ # @example
76
+ # my_sync_token = storage.get('sync_token')
77
+ # my_sync_token = client.sync(sync_token: my_sync_token) do |item|
78
+ # storage.put(item.dig('sys', 'id'), item) }
79
+ # end
80
+ # storage.put('sync_token', my_sync_token)
81
+ def sync(sync_token: nil, **query, &block)
82
+ return sync_old(sync_token: sync_token, **query) unless block_given?
83
+
84
+ sync_token =
85
+ if sync_token
86
+ { sync_token: sync_token }
87
+ else
88
+ { initial: true }
89
+ end
90
+ query = query.merge(sync_token)
91
+
92
+ _instrument 'sync', sync_token: sync_token, query: query do
93
+ resp = get('sync', query)
94
+ resp = SyncResponse.new(resp)
95
+ resp.assert_ok!
96
+
97
+ resp.each_page do |page|
98
+ page.page_items.each(&block)
99
+ sync_token = resp.next_sync_token
100
+ end
101
+ end
102
+
103
+ sync_token
104
+ end
105
+
106
+ private
107
+
108
+ def sync_old(sync_token: nil, **query)
109
+ ActiveSupport::Deprecation.warn('Sync without a block is deprecated, please use new block syntax instead')
110
+
111
+ sync_token =
112
+ if sync_token
113
+ { sync_token: sync_token }
114
+ else
115
+ { initial: true }
116
+ end
117
+ query = query.merge(sync_token)
118
+
119
+ resp =
120
+ _instrument 'sync', sync_token: sync_token, query: query do
121
+ get('sync', query)
122
+ end
123
+ resp = SyncResponse.new(resp, memoize: true)
124
+ resp.assert_ok!
125
+ end
126
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api Client
4
+ class WCC::Contentful::SimpleClient::Preview < WCC::Contentful::SimpleClient::Cdn
5
+ def initialize(space:, preview_token:, **options)
6
+ super(
7
+ **options,
8
+ api_url: options[:preview_api_url] || 'https://preview.contentful.com/',
9
+ space: space,
10
+ access_token: preview_token
11
+ )
12
+ end
13
+
14
+ def client_type
15
+ 'preview'
16
+ end
17
+ end
@@ -110,8 +110,9 @@ class WCC::Contentful::SimpleClient
110
110
  end
111
111
 
112
112
  class SyncResponse < Response
113
- def initialize(response)
113
+ def initialize(response, memoize: false)
114
114
  super(response.client, response.request, response.raw_response)
115
+ @memoize = memoize
115
116
  end
116
117
 
117
118
  def next_page?
@@ -120,6 +121,7 @@ class WCC::Contentful::SimpleClient
120
121
 
121
122
  def next_page
122
123
  return unless next_page?
124
+ return @next_page if @next_page
123
125
 
124
126
  url = raw['nextPageUrl']
125
127
  next_page =
@@ -129,26 +131,31 @@ class WCC::Contentful::SimpleClient
129
131
 
130
132
  next_page = SyncResponse.new(next_page)
131
133
  next_page.assert_ok!
134
+ @next_page = next_page if @memoize
135
+ next_page
132
136
  end
133
137
 
134
138
  def next_sync_token
135
- # If we haven't grabbed the next page yet, then our next "sync" will be getting
136
- # the next page. We could just as easily call sync again with that token.
137
- @next_page&.next_sync_token ||
138
- @next_sync_token ||= SyncResponse.parse_sync_token(
139
- raw['nextPageUrl'] || raw['nextSyncUrl']
140
- )
141
- end
142
-
143
- def each_page
144
- raise ArgumentError, 'Not a collection response' unless page_items
139
+ # If we have iterated some pages, return the sync token of the final
140
+ # page that was iterated. Do this without maintaining a reference to
141
+ # all the pages.
142
+ return @last_sync_token if @last_sync_token
145
143
 
146
- ret = PaginatingEnumerable.new(self)
144
+ SyncResponse.parse_sync_token(raw['nextPageUrl'] || raw['nextSyncUrl'])
145
+ end
147
146
 
147
+ def each_page(&block)
148
148
  if block_given?
149
- ret.map(&block)
149
+ super do |page|
150
+ @last_sync_token = page.next_sync_token
151
+
152
+ yield page
153
+ end
150
154
  else
151
- ret.lazy
155
+ super.map do |page|
156
+ @last_sync_token = page.next_sync_token
157
+ page
158
+ end
152
159
  end
153
160
  end
154
161
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  require_relative 'simple_client/response'
4
4
  require_relative 'simple_client/management'
5
+ require_relative 'simple_client/cdn'
6
+ require_relative 'simple_client/preview'
5
7
  require_relative 'instrumentation'
6
8
 
7
9
  module WCC::Contentful
@@ -146,109 +148,5 @@ module WCC::Contentful
146
148
  return resp
147
149
  end
148
150
  end
149
-
150
- # The CDN SimpleClient accesses 'https://cdn.contentful.com' to get raw
151
- # JSON responses. It exposes methods to query entries, assets, and content_types.
152
- # The responses are instances of WCC::Contentful::SimpleClient::Response
153
- # which handles paging automatically.
154
- #
155
- # @api Client
156
- class Cdn < SimpleClient
157
- def initialize(space:, access_token:, **options)
158
- super(
159
- api_url: options[:api_url] || 'https://cdn.contentful.com/',
160
- space: space,
161
- access_token: access_token,
162
- **options
163
- )
164
- end
165
-
166
- def client_type
167
- 'cdn'
168
- end
169
-
170
- # Gets an entry by ID
171
- def entry(key, query = {})
172
- resp =
173
- _instrument 'entries', id: key, type: 'Entry', query: query do
174
- get("entries/#{key}", query)
175
- end
176
- resp.assert_ok!
177
- end
178
-
179
- # Queries entries with optional query parameters
180
- def entries(query = {})
181
- resp =
182
- _instrument 'entries', type: 'Entry', query: query do
183
- get('entries', query)
184
- end
185
- resp.assert_ok!
186
- end
187
-
188
- # Gets an asset by ID
189
- def asset(key, query = {})
190
- resp =
191
- _instrument 'entries', type: 'Asset', id: key, query: query do
192
- get("assets/#{key}", query)
193
- end
194
- resp.assert_ok!
195
- end
196
-
197
- # Queries assets with optional query parameters
198
- def assets(query = {})
199
- resp =
200
- _instrument 'entries', type: 'Asset', query: query do
201
- get('assets', query)
202
- end
203
- resp.assert_ok!
204
- end
205
-
206
- # Queries content types with optional query parameters
207
- def content_types(query = {})
208
- resp =
209
- _instrument 'content_types', query: query do
210
- get('content_types', query)
211
- end
212
- resp.assert_ok!
213
- end
214
-
215
- # Accesses the Sync API to get a list of items that have changed since
216
- # the last sync.
217
- #
218
- # If `sync_token` is nil, an initial sync is performed.
219
- # Returns a WCC::Contentful::SimpleClient::SyncResponse
220
- # which handles paging automatically.
221
- def sync(sync_token: nil, **query)
222
- sync_token =
223
- if sync_token
224
- { sync_token: sync_token }
225
- else
226
- { initial: true }
227
- end
228
- query = query.merge(sync_token)
229
- resp =
230
- _instrument 'sync', sync_token: sync_token, query: query do
231
- get('sync', query)
232
- end
233
- resp = SyncResponse.new(resp)
234
- resp.assert_ok!
235
- end
236
- end
237
-
238
- # @api Client
239
- class Preview < Cdn
240
- def initialize(space:, preview_token:, **options)
241
- super(
242
- **options,
243
- api_url: options[:preview_api_url] || 'https://preview.contentful.com/',
244
- space: space,
245
- access_token: preview_token
246
- )
247
- end
248
-
249
- def client_type
250
- 'preview'
251
- end
252
- end
253
151
  end
254
152
  end
@@ -50,30 +50,30 @@ module WCC::Contentful::Store
50
50
  # implementation calls into #set and #delete to perform the appropriate
51
51
  # operations in the store.
52
52
  def index(json)
53
+ # This implementation assumes that #delete and #set are individually thread-safe.
54
+ # No mutex is needed so long as the revisions are accurate.
53
55
  # Subclasses can override to do this in a more performant thread-safe way.
54
56
  # Example: postgres_store could do this in a stored procedure for speed
55
- mutex.with_write_lock do
56
- prev =
57
- case type = json.dig('sys', 'type')
58
- when 'DeletedEntry', 'DeletedAsset'
59
- delete(json.dig('sys', 'id'))
60
- else
61
- set(json.dig('sys', 'id'), json)
62
- end
63
-
64
- if (prev_rev = prev&.dig('sys', 'revision')) &&
65
- (next_rev = json.dig('sys', 'revision')) &&
66
- (next_rev < prev_rev)
67
- # Uh oh! we overwrote an entry with a prior revision. Put the previous back.
68
- return index(prev)
69
- end
70
-
71
- case type
57
+ prev =
58
+ case type = json.dig('sys', 'type')
72
59
  when 'DeletedEntry', 'DeletedAsset'
73
- nil
60
+ delete(json.dig('sys', 'id'))
74
61
  else
75
- json
62
+ set(json.dig('sys', 'id'), json)
76
63
  end
64
+
65
+ if (prev_rev = prev&.dig('sys', 'revision')) &&
66
+ (next_rev = json.dig('sys', 'revision')) &&
67
+ (next_rev < prev_rev)
68
+ # Uh oh! we overwrote an entry with a prior revision. Put the previous back.
69
+ return index(prev)
70
+ end
71
+
72
+ case type
73
+ when 'DeletedEntry', 'DeletedAsset'
74
+ nil
75
+ else
76
+ json
77
77
  end
78
78
  end
79
79
 
@@ -107,17 +107,9 @@ module WCC::Contentful::Store
107
107
  )
108
108
  end
109
109
 
110
- def initialize
111
- @mutex = Concurrent::ReentrantReadWriteLock.new
112
- end
113
-
114
110
  def ensure_hash(val)
115
111
  raise ArgumentError, 'Value must be a Hash' unless val.is_a?(Hash)
116
112
  end
117
-
118
- private
119
-
120
- attr_reader :mutex
121
113
  end
122
114
  end
123
115
 
@@ -9,13 +9,15 @@ module WCC::Contentful::Store
9
9
  class MemoryStore < Base
10
10
  def initialize
11
11
  super
12
+
13
+ @mutex = Concurrent::ReentrantReadWriteLock.new
12
14
  @hash = {}
13
15
  end
14
16
 
15
17
  def set(key, value)
16
18
  value = value.deep_dup.freeze
17
19
  ensure_hash value
18
- mutex.with_write_lock do
20
+ @mutex.with_write_lock do
19
21
  old = @hash[key]
20
22
  @hash[key] = value
21
23
  old
@@ -23,17 +25,17 @@ module WCC::Contentful::Store
23
25
  end
24
26
 
25
27
  def delete(key)
26
- mutex.with_write_lock do
28
+ @mutex.with_write_lock do
27
29
  @hash.delete(key)
28
30
  end
29
31
  end
30
32
 
31
33
  def keys
32
- mutex.with_read_lock { @hash.keys }
34
+ @mutex.with_read_lock { @hash.keys }
33
35
  end
34
36
 
35
37
  def find(key, **_options)
36
- mutex.with_read_lock do
38
+ @mutex.with_read_lock do
37
39
  @hash[key]
38
40
  end
39
41
  end
@@ -45,7 +47,8 @@ module WCC::Contentful::Store
45
47
  raise ArgumentError, "Operator :#{bad_op} not supported"
46
48
  end
47
49
 
48
- relation = mutex.with_read_lock { @hash.values }
50
+ # Since @hash.values returns a new array, we only need to lock here
51
+ relation = @mutex.with_read_lock { @hash.values }
49
52
 
50
53
  # relation is an enumerable that we apply conditions to in the form of
51
54
  # Enumerable#select and Enumerable#reject.
@@ -23,18 +23,22 @@ module WCC::Contentful::Store
23
23
  connection_options ||= { dbname: 'postgres' }
24
24
  pool_options ||= {}
25
25
  @connection_pool = PostgresStore.build_connection_pool(connection_options, pool_options)
26
- @dirty = false
26
+ @dirty = Concurrent::AtomicBoolean.new
27
+ @mutex = Mutex.new
27
28
  end
28
29
 
29
30
  def set(key, value)
30
31
  ensure_hash value
32
+
31
33
  result =
32
- @connection_pool.with do |conn|
33
- conn.exec_prepared('upsert_entry', [
34
- key,
35
- value.to_json,
36
- quote_array(extract_links(value))
37
- ])
34
+ _instrument 'upsert_entry' do
35
+ @connection_pool.with do |conn|
36
+ conn.exec_prepared('upsert_entry', [
37
+ key,
38
+ value.to_json,
39
+ quote_array(extract_links(value))
40
+ ])
41
+ end
38
42
  end
39
43
 
40
44
  previous_value =
@@ -45,16 +49,23 @@ module WCC::Contentful::Store
45
49
  JSON.parse(val) if val
46
50
  end
47
51
 
48
- if views_need_update?(value, previous_value) && !mutex.with_read_lock { @dirty }
49
- _instrument 'mark_dirty'
50
- mutex.with_write_lock { @dirty = true }
52
+ if views_need_update?(value, previous_value)
53
+ # Mark the views as needing to be refreshed, they will be refreshed on the next query.
54
+ was_dirty = @dirty.make_true
55
+ # Send out an instrumentation event if we are the thread that marked it dirty
56
+ # (make_true returns true if the value changed)
57
+ _instrument 'mark_dirty' if was_dirty
51
58
  end
52
59
 
53
60
  previous_value
54
61
  end
55
62
 
56
63
  def keys
57
- result = @connection_pool.with { |conn| conn.exec_prepared('select_ids') }
64
+ result =
65
+ _instrument 'select_ids' do
66
+ @connection_pool.with { |conn| conn.exec_prepared('select_ids') }
67
+ end
68
+
58
69
  arr = []
59
70
  result.each { |r| arr << r['id'].strip }
60
71
  arr
@@ -63,14 +74,21 @@ module WCC::Contentful::Store
63
74
  end
64
75
 
65
76
  def delete(key)
66
- result = @connection_pool.with { |conn| conn.exec_prepared('delete_by_id', [key]) }
77
+ result =
78
+ _instrument 'delete_by_id', key: key do
79
+ @connection_pool.with { |conn| conn.exec_prepared('delete_by_id', [key]) }
80
+ end
81
+
67
82
  return if result.num_tuples == 0
68
83
 
69
84
  JSON.parse(result.getvalue(0, 1))
70
85
  end
71
86
 
72
87
  def find(key, **_options)
73
- result = @connection_pool.with { |conn| conn.exec_prepared('select_entry', [key]) }
88
+ result =
89
+ _instrument 'select_entry', key: key do
90
+ @connection_pool.with { |conn| conn.exec_prepared('select_entry', [key]) }
91
+ end
74
92
  return if result.num_tuples == 0
75
93
 
76
94
  JSON.parse(result.getvalue(0, 1))
@@ -87,22 +105,21 @@ module WCC::Contentful::Store
87
105
  end
88
106
 
89
107
  def exec_query(statement, params = [])
90
- if mutex.with_read_lock { @dirty }
91
- was_dirty =
92
- mutex.with_write_lock do
93
- was_dirty = @dirty
94
- @dirty = false
95
- was_dirty
96
- end
97
-
98
- if was_dirty
99
- _instrument 'refresh_views' do
100
- @connection_pool.with { |conn| conn.exec_prepared('refresh_views_concurrently') }
108
+ if @dirty.true?
109
+ # Only one thread should call refresh_views_concurrently but all should wait for it to finish.
110
+ @mutex.synchronize do
111
+ # We have to check again b/c another thread may have gotten here first
112
+ if @dirty.true?
113
+ _instrument 'refresh_views' do
114
+ @connection_pool.with { |conn| conn.exec_prepared('refresh_views_concurrently') }
115
+ end
116
+ # Mark that the views have been refreshed.
117
+ @dirty.make_false
101
118
  end
102
119
  end
103
120
  end
104
121
 
105
- logger&.debug("[PostgresStore] #{statement}\n#{params.inspect}")
122
+ logger&.debug("[PostgresStore] #{statement} #{params.inspect}")
106
123
  _instrument 'exec' do
107
124
  @connection_pool.with { |conn| conn.exec(statement, params) }
108
125
  end
@@ -76,21 +76,23 @@ module WCC::Contentful
76
76
 
77
77
  @mutex.synchronize do
78
78
  @state ||= read_state || token_wrapper_factory(nil)
79
- next_sync_token = @state['token']
80
-
81
- sync_resp = client.sync(sync_token: next_sync_token)
82
- sync_resp.items.each do |item|
83
- id = item.dig('sys', 'id')
84
- id_found ||= id == up_to_id
85
-
86
- store.index(item) if store&.index?
87
- event = WCC::Contentful::Event.from_raw(item, source: self)
88
- yield(event) if block_given?
89
- emit_event(event)
90
- all_events << event
91
- end
79
+ sync_token = @state['token']
80
+
81
+ next_sync_token =
82
+ client.sync(sync_token: sync_token) do |item|
83
+ id = item.dig('sys', 'id')
84
+ id_found ||= id == up_to_id
85
+
86
+ store.index(item) if store&.index?
87
+ event = WCC::Contentful::Event.from_raw(item, source: self)
88
+ yield(event) if block_given?
89
+ emit_event(event)
90
+
91
+ # Only keep the "sys" not the content in case we have a large space
92
+ all_events << WCC::Contentful::Event.from_raw(item.slice('sys'), source: self)
93
+ end
92
94
 
93
- @state = @state.merge('token' => sync_resp.next_sync_token)
95
+ @state = @state.merge('token' => next_sync_token)
94
96
  write_state
95
97
  end
96
98
 
@@ -136,13 +138,19 @@ module WCC::Contentful
136
138
  # This job uses the Contentful Sync API to update the configured store with
137
139
  # the latest data from Contentful.
138
140
  class Job < ActiveJob::Base
139
- include WCC::Contentful::ServiceAccessors
140
-
141
141
  self.queue_adapter = :async
142
142
  queue_as :default
143
143
 
144
+ def configuration
145
+ @configuration ||= WCC::Contentful.configuration
146
+ end
147
+
148
+ def services
149
+ @services ||= WCC::Contentful::Services.instance
150
+ end
151
+
144
152
  def perform(event = nil)
145
- return unless sync_engine&.should_sync?
153
+ return unless services.sync_engine&.should_sync?
146
154
 
147
155
  up_to_id = nil
148
156
  retry_count = 0
@@ -162,9 +170,9 @@ module WCC::Contentful
162
170
  # the sync again after a few minutes.
163
171
  #
164
172
  def sync!(up_to_id: nil, retry_count: 0)
165
- id_found, count = sync_engine.next(up_to_id: up_to_id)
173
+ id_found, count = services.sync_engine.next(up_to_id: up_to_id)
166
174
 
167
- next_sync_token = sync_engine.state['token']
175
+ next_sync_token = services.sync_engine.state['token']
168
176
 
169
177
  logger.info "Synced #{count} entries. Next sync token:\n #{next_sync_token}"
170
178
  unless id_found
@@ -2,6 +2,6 @@
2
2
 
3
3
  module WCC
4
4
  module Contentful
5
- VERSION = '1.2.1'
5
+ VERSION = '1.3.0'
6
6
  end
7
7
  end
@@ -46,9 +46,8 @@ module WCC::Contentful
46
46
  end
47
47
 
48
48
  def logger
49
- return Rails.logger if defined?(Rails)
50
-
51
- @logger ||= Logger.new($stderr)
49
+ ActiveSupport::Deprecation.warn('Use WCC::Contentful::Services.instance.logger instead')
50
+ WCC::Contentful::Services.instance.logger
52
51
  end
53
52
  end
54
53
 
@@ -90,7 +89,7 @@ module WCC::Contentful
90
89
  rescue WCC::Contentful::SimpleClient::ApiError => e
91
90
  raise InitializationError, e if configuration.update_schema_file == :always
92
91
 
93
- WCC::Contentful.logger.warn("Unable to download schema from management API - #{e.message}")
92
+ Services.instance.logger.warn("Unable to download schema from management API - #{e.message}")
94
93
  end
95
94
  end
96
95
 
@@ -98,7 +97,7 @@ module WCC::Contentful
98
97
  begin
99
98
  JSON.parse(File.read(configuration.schema_file))['contentTypes'] if File.exist?(configuration.schema_file)
100
99
  rescue JSON::ParserError
101
- WCC::Contentful.logger.warn("Schema file invalid, ignoring it: #{configuration.schema_file}")
100
+ Services.instance.warn("Schema file invalid, ignoring it: #{configuration.schema_file}")
102
101
  nil
103
102
  end
104
103
 
@@ -112,7 +111,7 @@ module WCC::Contentful
112
111
  content_types = client.content_types(limit: 1000).items if client
113
112
  rescue WCC::Contentful::SimpleClient::ApiError => e
114
113
  # indicates bad credentials
115
- WCC::Contentful.logger.warn("Unable to load content types from API - #{e.message}")
114
+ Services.instance.logger.warn("Unable to load content types from API - #{e.message}")
116
115
  end
117
116
  end
118
117
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wcc-contentful
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Watermark Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-09 00:00:00.000000000 Z
11
+ date: 2022-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -452,7 +452,9 @@ files:
452
452
  - lib/wcc/contentful/rspec.rb
453
453
  - lib/wcc/contentful/services.rb
454
454
  - lib/wcc/contentful/simple_client.rb
455
+ - lib/wcc/contentful/simple_client/cdn.rb
455
456
  - lib/wcc/contentful/simple_client/management.rb
457
+ - lib/wcc/contentful/simple_client/preview.rb
456
458
  - lib/wcc/contentful/simple_client/response.rb
457
459
  - lib/wcc/contentful/simple_client/typhoeus_adapter.rb
458
460
  - lib/wcc/contentful/store.rb
@@ -489,7 +491,7 @@ homepage: https://github.com/watermarkchurch/wcc-contentful/wcc-contentful
489
491
  licenses:
490
492
  - MIT
491
493
  metadata:
492
- documentation_uri: https://watermarkchurch.github.io/wcc-contentful/1.2/wcc-contentful
494
+ documentation_uri: https://watermarkchurch.github.io/wcc-contentful/1.3/wcc-contentful
493
495
  rubygems_mfa_required: 'true'
494
496
  post_install_message:
495
497
  rdoc_options: []