bbk-app 1.1.4.345715 → 1.2.0.352691

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: b1ecd4e36a51360fddad370dc82e1cca9724614a4aa7ecb8870709e5ccc22b90
4
- data.tar.gz: 9b4cbd8ef5351ea2833857f5f8f9b3a41026ecd9732a22bc81595dd0c2537c91
3
+ metadata.gz: 3fdd4d2062e762078e538d9f8dcd44e5f47b85dd0b31ddeacd10c20caafe5475
4
+ data.tar.gz: b31fcc3260b70553b24ce500af73b96e888e7e472f2dfa2ee0bc4d9a00db70d8
5
5
  SHA512:
6
- metadata.gz: 155cf4abffd437beef487f091fd8b4009931c4965477aa07862a433263dba1cffefb097d05de35fe41805b66f6dc6f6099acaf6d305bd892a18daafcd4193b05
7
- data.tar.gz: 0557caa117d0a54faf14ba607ac14f6a5473f700935ab21b8108904235bfe9e7e45be2d1c12a75d8b3918bfe66169a5f2cdb543fa9c91d855402db56837b1cf0
6
+ metadata.gz: 68fbf3dd3307789e4094f289dd7f9837f27396ce7fd77ccca246de70f14cc5c692638303404d6a439ae338506d3aade5a6660f4ce5f846edc2b693bd10d90cc6
7
+ data.tar.gz: baa246afbee6385803b0ceb4f2472e4cd80a78f318a8090aa262ec9f0ce6e87734897168cd41a236f32e02b8d011f897a0f43d901798d98dd1084fb4dccdab79
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bbk-app (1.1.4)
5
- activesupport (~> 7.1)
4
+ bbk-app (1.2.0)
5
+ activesupport (>= 6.0)
6
6
  bbk-utils (> 1.0.1)
7
7
  oj
8
8
  timeouter
@@ -38,11 +38,12 @@ GEM
38
38
  ice_nine (~> 0.11.0)
39
39
  thread_safe (~> 0.3, >= 0.3.1)
40
40
  base64 (0.3.0)
41
- bbk-utils (1.0.1.147183)
42
- activesupport (>= 6.0)
41
+ bbk-utils (1.1.4.347221)
42
+ activesupport (>= 7.0)
43
43
  russian
44
+ securerandom (~> 0.3.2)
44
45
  benchmark (0.5.0)
45
- bigdecimal (3.3.1)
46
+ bigdecimal (4.0.1)
46
47
  bunny (2.19.0)
47
48
  amq-protocol (~> 2.3, >= 2.3.1)
48
49
  sorted_set (~> 1, >= 1.0.2)
@@ -51,8 +52,8 @@ GEM
51
52
  byebug (11.1.3)
52
53
  coercible (1.0.0)
53
54
  descendants_tracker (~> 0.0.1)
54
- concurrent-ruby (1.3.5)
55
- connection_pool (3.0.1)
55
+ concurrent-ruby (1.3.6)
56
+ connection_pool (3.0.2)
56
57
  database_cleaner (2.1.0)
57
58
  database_cleaner-active_record (>= 2, < 3)
58
59
  database_cleaner-active_record (2.2.2)
@@ -85,7 +86,8 @@ GEM
85
86
  addressable (~> 2.7)
86
87
  logger (1.7.0)
87
88
  mini_portile2 (2.8.9)
88
- minitest (5.26.2)
89
+ minitest (6.0.0)
90
+ prism (~> 1.5)
89
91
  oj (3.16.13)
90
92
  bigdecimal (>= 3.0)
91
93
  ostruct (>= 0.2)
@@ -94,6 +96,7 @@ GEM
94
96
  parser (3.0.3.2)
95
97
  ast (~> 2.4.1)
96
98
  path_expander (1.1.0)
99
+ prism (1.7.0)
97
100
  public_suffix (4.0.6)
98
101
  rainbow (3.1.1)
99
102
  rake (12.3.3)
@@ -146,7 +149,7 @@ GEM
146
149
  virtus (~> 1.0)
147
150
  russian (0.6.0)
148
151
  i18n (>= 0.5.0)
149
- securerandom (0.4.1)
152
+ securerandom (0.3.2)
150
153
  set (1.1.0)
151
154
  sexp_processor (4.16.0)
152
155
  simplecov (0.21.2)
@@ -187,7 +190,7 @@ PLATFORMS
187
190
  x86_64-linux-musl
188
191
 
189
192
  DEPENDENCIES
190
- activerecord (~> 7.1)
193
+ activerecord (>= 6.0)
191
194
  bbk-app!
192
195
  bundler (~> 2.0)
193
196
  bunny-mock (~> 1.7.0)
@@ -3,6 +3,7 @@ require 'oj'
3
3
  module BBK
4
4
  module App
5
5
  class Dispatcher
6
+ # Базовый класс сообщений для фреймворка BBK
6
7
  class Message
7
8
 
8
9
  attr_reader :consumer, :delivery_info, :headers, :body
@@ -14,6 +15,7 @@ module BBK
14
15
  @body = body
15
16
  @acked = false
16
17
  @nacked = false
18
+ @restored = false
17
19
  end
18
20
 
19
21
  # Lazy body parsing
@@ -88,6 +90,53 @@ module BBK
88
90
  acked? || nacked?
89
91
  end
90
92
 
93
+ # Признак того что обхект восстановлен после сериализации через {#marshal_dump}
94
+ def restored?
95
+ @restored
96
+ end
97
+
98
+ # типы данных, допустимые для {::Marshal#dump}
99
+ ALLOWED_FOR_DUMP = [ Time, FalseClass, TrueClass, NilClass, String, Integer, Float, Symbol ].freeze
100
+
101
+
102
+ # Реализация быстрой и "полной" сериализации через {::Marshal#dump}
103
+ # Сложные объекты (которые могут содержать `Proc`, `IO` и пр.) нельзя сериализовывать,
104
+ # например в нутриBBK::AMQP::Message находится Consumer с такими членами.
105
+ #
106
+ # Используется например при передачи объекта Message куда-то, например в ActiveJob
107
+ #
108
+ # При наследовании можно использолвать так:
109
+ # ```ruby
110
+ # def marshal_dump
111
+ # [@my_attribute] + super
112
+ # end
113
+ #
114
+ # def marshal_load(array)
115
+ # @my_attribute, *parent_attributes = array
116
+ # super(parent_attributes)
117
+ # end
118
+ # ```
119
+ def marshal_dump
120
+ [ nil, marshal_dump_object(@delivery_info), @headers, @body, @payload, true]
121
+ end
122
+
123
+ # Реализация быстрой и "полной" сериализации через {::Marshal#dump}
124
+ # @see marshal_dump
125
+ def marshal_load(array)
126
+ @consumer, @delivery_info, @headers, @body, @payload, @restored = array
127
+ end
128
+
129
+ def marshal_dump_object(object)
130
+ case object
131
+ when Hash
132
+ object.transform_values {|v| marshal_dump_object(v) }
133
+ when Array, Enumerable
134
+ object.map {|v| marshal_dump_object(v) }
135
+ else
136
+ ALLOWED_FOR_DUMP.include?(object.class) ? object : nil
137
+ end
138
+ end
139
+
91
140
  end
92
141
  end
93
142
  end
@@ -118,7 +118,7 @@ module BBK
118
118
  next unless m.respond_to?(:stop)
119
119
  m.stop
120
120
  rescue StandardError => e
121
- logger.error "Middlware #{m} stop error: #{e}"
121
+ logger.error "Middleware #{m} stop error: #{e}"
122
122
  logger.debug e.backtrace
123
123
  end
124
124
 
@@ -185,17 +185,29 @@ match: matched, processor: processor, exception: e
185
185
  end
186
186
 
187
187
  def find_processor(msg)
188
- matched, callback = @observer.match(msg.headers, msg.payload, msg.delivery_info)
188
+ matched, callback = if @observer.respond_to?(:match_message)
189
+ # Новый интерфейс рассчитаный на BBK::Message
190
+ @observer.match_message(msg)
191
+ else
192
+ # старый интерфейс
193
+ @observer.match(msg.headers, msg.payload, msg.delivery_info)
194
+ end
195
+
189
196
  [matched, callback.is_a?(BBK::App::Factory) ? callback.create : callback]
190
197
  end
191
198
 
192
199
  def build_processing_stack
193
- stack = proc{|msg| process_message(msg) }
194
- middlewares.reverse.reduce(stack) do |stack, middleware|
195
- if middleware.respond_to?(:build)
196
- middleware.build(stack)
197
- else
198
- middleware.new(stack)
200
+ # Оптимизация.Строим стэк только один раз. Могут быть проблемы, но надеюсь что всё будет норм
201
+ # Если какая-то мидлварь НЕ должна сохранять состояние (а случайно сохраняет), пусть
202
+ # реализует метод build и чистит состояние
203
+ @processing_stack ||= begin
204
+ stack = proc{|msg| process_message(msg) }
205
+ middlewares.reverse.reduce(stack) do |stack, middleware|
206
+ if middleware.respond_to?(:build)
207
+ middleware.build(stack)
208
+ else
209
+ middleware.new(stack)
210
+ end
199
211
  end
200
212
  end
201
213
  end
@@ -54,6 +54,9 @@ module BBK
54
54
  @default = block
55
55
  end
56
56
 
57
+ # Старый интерфейс в {Dispatcher} он требовал обязательной распоковки всех полей:
58
+ # например метод `.body` у {Message} это байты, а `.payload` это `JSON.parse(body)`
59
+ # новый {.match_message} получает целиком message и потом моэно решить надо распаковывать или нет
57
60
  def match(metadata, payload, delivery_info)
58
61
  @handlers.each_with_object([nil, @default]) do |p, _res|
59
62
  m, h = p
@@ -63,6 +66,11 @@ module BBK
63
66
  end
64
67
  end
65
68
 
69
+ # новый интерфейс для возможной оптимизации
70
+ def match_message(msg)
71
+ match(msg.headers, msg.payload, msg.delivery_info)
72
+ end
73
+
66
74
  end
67
75
  end
68
76
  end
@@ -83,7 +83,7 @@ RSpec.shared_examples 'BBK::App::Dispatcher::Message' do
83
83
  let(:message_id) { SecureRandom.hex }
84
84
  let(:addon) { SecureRandom.hex }
85
85
  let(:first_call) { message.reply_message_id(addon) }
86
- subject(:messagreply_message_ide_id) { message.message_id }
86
+ subject(:reply_message_id) { message.message_id }
87
87
 
88
88
  it {
89
89
  expect(message).to receive(:message_id).and_return(message_id)
@@ -95,6 +95,9 @@ RSpec.shared_examples 'BBK::App::Dispatcher::Message' do
95
95
  expect(first_call).to eq(message.reply_message_id(addon))
96
96
  }
97
97
  end
98
+
99
+
98
100
  end
101
+
99
102
  end
100
103
 
@@ -1,7 +1,7 @@
1
1
  module BBK
2
2
  module App
3
3
 
4
- VERSION = '1.1.4'.freeze
4
+ VERSION = '1.2.0'.freeze
5
5
 
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bbk-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4.345715
4
+ version: 1.2.0.352691
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samoilenko Yuri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-12-11 00:00:00.000000000 Z
11
+ date: 2026-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport