appydays 0.12.1 → 0.13.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: cb1862009d51664566983d9878a212b53fbe7db55fa434e169460f86e946f7ed
4
- data.tar.gz: 7eecb5b9dcbe494cdbfeb8724ac28f2e6a51db029caab5a39b5d5d8c2b08a7ea
3
+ metadata.gz: c62e5c29b61ec33a407cded74ed7aa319d35930f967abb466e320301ca95d54d
4
+ data.tar.gz: 02f4728257bc7939e2523cde295eae642f7ae7e3380e2317a471041228a53990
5
5
  SHA512:
6
- metadata.gz: 4a0c0fd8f35ac2e1d39a91cb6b9a32b753e57035c4f34e6ef42a16f32dd344ce7acd18b2198037b5b47e18132ddffcafeedae593dc5b9cf65c1b92756c6ff5c3
7
- data.tar.gz: a9d3043afcb2e5c4338757fc83107b77d1bd67dccc863fed42e6114d512898794cc8723b07673f80f51fee4a527a03577c40a2476e43370ed0187b46833e6735
6
+ metadata.gz: ec323ab87f7d961d3a4a1f2dcf43f225ab5a7d6420bfeb99a10e357e07c57a3ed356be9aeeba81475f205b6eea5a678d5dfbe9eed9f0822739931f0661bcbbec
7
+ data.tar.gz: f1cba7a203aac0fd4cbca21b61c89de8472d564b0f85c3c41c8ddb2cf6947fd47f772f8723dddf3edd929cd5bd6cc497babd70e1e486a830322289e92e717713
@@ -107,7 +107,7 @@ module Appydays::Configurable
107
107
  @target.define_singleton_method(name) do
108
108
  self.class_variable_get("@@#{name}")
109
109
  end
110
- @target.define_singleton_method("#{name}=".to_sym) do |v|
110
+ @target.define_singleton_method(:"#{name}=") do |v|
111
111
  installer._set_value(name, v, side_effect)
112
112
  end
113
113
 
@@ -136,10 +136,10 @@ module Appydays::Configurable
136
136
  def _converter(default, converter)
137
137
  return converter if converter
138
138
 
139
- return ->(v) { v.to_s } if default.nil? || default.is_a?(String)
140
- return ->(v) { v.to_i } if default.is_a?(Integer)
141
- return ->(v) { v.to_f } if default.is_a?(Float)
142
- return ->(v) { v.to_sym } if default.is_a?(Symbol)
139
+ return lambda(&:to_s) if default.nil? || default.is_a?(String)
140
+ return lambda(&:to_i) if default.is_a?(Integer)
141
+ return lambda(&:to_f) if default.is_a?(Float)
142
+ return lambda(&:to_sym) if default.is_a?(Symbol)
143
143
  return ->(v) { v.casecmp("true").zero? } if [TrueClass, FalseClass].include?(default.class)
144
144
  raise TypeError, "Uncoercable type %p" % [default.class]
145
145
  end
@@ -161,7 +161,7 @@ module Appydays::Configurable
161
161
  def _reset(overrides)
162
162
  @settings.each do |k, v|
163
163
  real_v = overrides.fetch(k, v)
164
- @target.send("#{k}=".to_sym, real_v)
164
+ @target.send(:"#{k}=", real_v)
165
165
  end
166
166
  self._run_after_configured
167
167
  end
@@ -41,7 +41,7 @@ module Appydays::Dotenviable
41
41
  ".env",
42
42
  ]
43
43
  orig_env = nil
44
- if env.object_id != ENV.object_id
44
+ unless env.equal?(ENV)
45
45
  orig_env = ENV.to_h
46
46
  ENV.replace(env)
47
47
  end
@@ -48,7 +48,7 @@ class Appydays::Loggable::RequestLogger
48
48
  status, header, body = SemanticLogger.named_tagged(request_id:) do
49
49
  @app.call(env)
50
50
  end
51
- header = Rack::Utils::HeaderHash.new(header)
51
+ header = Rack::Headers[header]
52
52
  body = Rack::BodyProxy.new(body) { self.log_finished(env, began_at, status, header) }
53
53
  [status, header, body]
54
54
  rescue StandardError => e
@@ -117,7 +117,7 @@ class Appydays::Loggable::RequestLogger
117
117
  # This allows you to add useful context to the request without needing
118
118
  # a dedicated log message.
119
119
  # See README for more info.
120
- def self.set_request_tags(**tags)
120
+ def self.set_request_tags(tags)
121
121
  Thread.current[:appydays_request_logger_request_tags] ||= {}
122
122
  Thread.current[:appydays_request_logger_request_tags].merge!(tags)
123
123
  end
@@ -13,12 +13,34 @@ class Sequel::Database
13
13
  # Use nil to disable the full message logging.
14
14
  module AppydaysLogger
15
15
  class << self
16
- attr_accessor :truncate_messages_over, :truncation_message, :truncation_context, :log_full_message_level
16
+ # Messages more than this many characters are truncated.
17
+ # Defaults to 2000.
18
+ attr_accessor :truncate_messages_over
19
+
20
+ # Placeholder message when truncation occurs.
21
+ # Defaults to '<truncated>'.
22
+ attr_accessor :truncation_message
23
+
24
+ # How many characters to preserve before and after truncation.
25
+ # Defaults to 200 (400 total).
26
+ attr_accessor :truncation_context
27
+
28
+ # If set, log the full message at this level when truncation occurs.
29
+ # For example, a truncated message may be logged at :info,
30
+ # and the full message logged at +:default+.
31
+ # Defaults to +nil+ (does not log full messages when truncation occurs).
32
+ attr_accessor :log_full_message_level
33
+
34
+ # Log slow queries at this level.
35
+ # See +Sequel::Database#log_warn_duration+.
36
+ # Default to +:warn+.
37
+ attr_accessor :slow_query_log_level
17
38
 
18
39
  def setdefaults
19
40
  @truncate_messages_over = 2000
20
- @truncation_message = "<truncated, full message logged at debug>"
41
+ @truncation_message = "<truncated>"
21
42
  @truncation_context = 200
43
+ @slow_query_log_level = :warn
22
44
  end
23
45
 
24
46
  def truncate_message(message)
@@ -58,7 +80,7 @@ class Sequel::Database
58
80
  lwd = log_warn_duration
59
81
  was_truncated = false
60
82
  log_each(
61
- lwd && (duration >= lwd) ? :warn : sql_log_level,
83
+ lwd && (duration >= lwd) ? AppydaysLogger.slow_query_log_level : sql_log_level,
62
84
  proc { "(#{'%0.6fs' % duration}) #{message}" },
63
85
  proc do
64
86
  query = AppydaysLogger.truncate_message(message)
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "sidekiq"
4
- require "sidekiq/version"
4
+ require "sidekiq/component"
5
5
  require "sidekiq/job_logger"
6
+ require "sidekiq/version"
6
7
 
7
8
  require "appydays/loggable"
8
9
  require "appydays/configurable"
@@ -10,15 +11,15 @@ require "appydays/configurable"
10
11
  class Appydays::Loggable::SidekiqJobLogger < Sidekiq::JobLogger
11
12
  include Appydays::Configurable
12
13
  include Appydays::Loggable
13
- begin
14
- require "sidekiq/util"
15
- include Sidekiq::Util
16
- rescue LoadError
17
- require "sidekiq/component"
18
- include Sidekiq::Component
19
- end
14
+ include Sidekiq::Component
20
15
 
21
- Sidekiq.logger = self.logger
16
+ # Level to log 'job_done' messages at.
17
+ # Defaults to +:info+.
18
+ attr_accessor :log_level_job_done
19
+
20
+ # Level to log slow jobs at.
21
+ # Defaults to +:warn+.
22
+ attr_accessor :log_level_slow_job
22
23
 
23
24
  def call(item, _queue, &)
24
25
  start = self.now
@@ -38,7 +39,11 @@ class Appydays::Loggable::SidekiqJobLogger < Sidekiq::JobLogger
38
39
  extra_tags = {job_class: item["class"], thread_id: self.tid}
39
40
  yield
40
41
  duration = self.elapsed(start)
41
- log_method = duration >= self.slow_job_seconds ? :warn : :info
42
+ log_method = if duration >= self.slow_job_seconds
43
+ self.log_level_slow_job || :warn
44
+ else
45
+ self.log_level_job_done || :info
46
+ end
42
47
  self.logger.send(log_method, "job_done", duration: duration * 1000, **extra_tags, **self.class.job_tags)
43
48
  rescue StandardError
44
49
  # Do not log the error since it is probably a sidekiq retry error
@@ -68,7 +73,7 @@ class Appydays::Loggable::SidekiqJobLogger < Sidekiq::JobLogger
68
73
 
69
74
  def self.job_tags = Thread.current[:appydays_sidekiq_job_logger_job_tags] || {}
70
75
 
71
- def self.error_handler(ex, ctx)
76
+ def self.error_handler(ex, ctx, _config)
72
77
  # ctx looks like:
73
78
  # {
74
79
  # :context=>"Job raised exception",
@@ -7,7 +7,7 @@ module Appydays::Loggable::SpecHelpers
7
7
  # Appydays::Loggable.ensure_stderr_appender
8
8
 
9
9
  context.around(:each) do |example|
10
- override_level = (example.metadata[:log] || example.metadata[:logging])
10
+ override_level = example.metadata[:log] || example.metadata[:logging]
11
11
  if override_level
12
12
  orig_level = SemanticLogger.default_level
13
13
  SemanticLogger.default_level = override_level
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appydays
4
- VERSION = "0.12.1"
4
+ VERSION = "0.13.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appydays
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lithic Tech
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-10-20 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: dotenv
@@ -16,14 +15,14 @@ dependencies:
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '2.7'
18
+ version: '3.1'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
- version: '2.7'
25
+ version: '3.1'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: semantic_logger
29
28
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +85,14 @@ dependencies:
86
85
  requirements:
87
86
  - - "~>"
88
87
  - !ruby/object:Gem::Version
89
- version: '2.2'
88
+ version: '3.1'
90
89
  type: :development
91
90
  prerelease: false
92
91
  version_requirements: !ruby/object:Gem::Requirement
93
92
  requirements:
94
93
  - - "~>"
95
94
  - !ruby/object:Gem::Version
96
- version: '2.2'
95
+ version: '3.1'
97
96
  - !ruby/object:Gem::Dependency
98
97
  name: rspec
99
98
  requirement: !ruby/object:Gem::Requirement
@@ -142,56 +141,56 @@ dependencies:
142
141
  requirements:
143
142
  - - "~>"
144
143
  - !ruby/object:Gem::Version
145
- version: 1.31.1
144
+ version: 1.77.0
146
145
  type: :development
147
146
  prerelease: false
148
147
  version_requirements: !ruby/object:Gem::Requirement
149
148
  requirements:
150
149
  - - "~>"
151
150
  - !ruby/object:Gem::Version
152
- version: 1.31.1
151
+ version: 1.77.0
153
152
  - !ruby/object:Gem::Dependency
154
153
  name: rubocop-performance
155
154
  requirement: !ruby/object:Gem::Requirement
156
155
  requirements:
157
156
  - - "~>"
158
157
  - !ruby/object:Gem::Version
159
- version: 1.14.2
158
+ version: 1.25.0
160
159
  type: :development
161
160
  prerelease: false
162
161
  version_requirements: !ruby/object:Gem::Requirement
163
162
  requirements:
164
163
  - - "~>"
165
164
  - !ruby/object:Gem::Version
166
- version: 1.14.2
165
+ version: 1.25.0
167
166
  - !ruby/object:Gem::Dependency
168
167
  name: rubocop-rake
169
168
  requirement: !ruby/object:Gem::Requirement
170
169
  requirements:
171
170
  - - "~>"
172
171
  - !ruby/object:Gem::Version
173
- version: 0.6.0
172
+ version: 0.7.1
174
173
  type: :development
175
174
  prerelease: false
176
175
  version_requirements: !ruby/object:Gem::Requirement
177
176
  requirements:
178
177
  - - "~>"
179
178
  - !ruby/object:Gem::Version
180
- version: 0.6.0
179
+ version: 0.7.1
181
180
  - !ruby/object:Gem::Dependency
182
181
  name: rubocop-sequel
183
182
  requirement: !ruby/object:Gem::Requirement
184
183
  requirements:
185
184
  - - "~>"
186
185
  - !ruby/object:Gem::Version
187
- version: 0.3.4
186
+ version: 0.4.1
188
187
  type: :development
189
188
  prerelease: false
190
189
  version_requirements: !ruby/object:Gem::Requirement
191
190
  requirements:
192
191
  - - "~>"
193
192
  - !ruby/object:Gem::Version
194
- version: 0.3.4
193
+ version: 0.4.1
195
194
  - !ruby/object:Gem::Dependency
196
195
  name: sequel
197
196
  requirement: !ruby/object:Gem::Requirement
@@ -212,14 +211,14 @@ dependencies:
212
211
  requirements:
213
212
  - - "~>"
214
213
  - !ruby/object:Gem::Version
215
- version: '6.0'
214
+ version: '8.0'
216
215
  type: :development
217
216
  prerelease: false
218
217
  version_requirements: !ruby/object:Gem::Requirement
219
218
  requirements:
220
219
  - - "~>"
221
220
  - !ruby/object:Gem::Version
222
- version: '6.0'
221
+ version: '8.0'
223
222
  - !ruby/object:Gem::Dependency
224
223
  name: simplecov
225
224
  requirement: !ruby/object:Gem::Requirement
@@ -252,7 +251,6 @@ description: 'appydays provides support for env-based configuration, and common
252
251
  logging capabilities
253
252
 
254
253
  '
255
- email:
256
254
  executables: []
257
255
  extensions: []
258
256
  extra_rdoc_files: []
@@ -273,7 +271,6 @@ licenses:
273
271
  - MIT
274
272
  metadata:
275
273
  rubygems_mfa_required: 'true'
276
- post_install_message:
277
274
  rdoc_options: []
278
275
  require_paths:
279
276
  - lib
@@ -281,15 +278,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
281
278
  requirements:
282
279
  - - ">="
283
280
  - !ruby/object:Gem::Version
284
- version: 3.1.0
281
+ version: 3.2.0
285
282
  required_rubygems_version: !ruby/object:Gem::Requirement
286
283
  requirements:
287
284
  - - ">="
288
285
  - !ruby/object:Gem::Version
289
286
  version: '0'
290
287
  requirements: []
291
- rubygems_version: 3.3.3
292
- signing_key:
288
+ rubygems_version: 3.6.7
293
289
  specification_version: 4
294
290
  summary: Provides support for env-based configuration, and common structured logging
295
291
  capabilities