protobuf 3.10.9 → 3.10.10

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.
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+ require 'protobuf/railtie'
3
+
4
+ RSpec.describe Protobuf::Railtie do
5
+ let(:config) do
6
+ double('config', :protobuf => ::ActiveSupport::OrderedOptions.new)
7
+ end
8
+
9
+ let(:app) { double('app', :config => config, :root => Pathname.new('/srv/app')) }
10
+
11
+ describe '.services_path' do
12
+ it 'is nil when not configured (opt-in)' do
13
+ expect(described_class.services_path(app)).to be_nil
14
+ end
15
+
16
+ it 'is nil when configured as an empty string' do
17
+ config.protobuf.services_path = ''
18
+ expect(described_class.services_path(app)).to be_nil
19
+ end
20
+
21
+ it 'honors an absolute path' do
22
+ config.protobuf.services_path = '/custom/services'
23
+ expect(described_class.services_path(app)).to eq('/custom/services')
24
+ end
25
+
26
+ it 'resolves a relative path against the app root' do
27
+ config.protobuf.services_path = 'app/services/rpc'
28
+ expect(described_class.services_path(app)).to eq('/srv/app/app/services/rpc')
29
+ end
30
+
31
+ it 'accepts a Pathname' do
32
+ config.protobuf.services_path = Pathname.new('/custom/services')
33
+ expect(described_class.services_path(app)).to eq('/custom/services')
34
+ end
35
+ end
36
+
37
+ describe '.load_services' do
38
+ let(:loader) { double('autoloader') }
39
+
40
+ before do
41
+ allow(described_class).to receive(:services_path).and_return('/svc')
42
+ allow(::File).to receive(:directory?).and_call_original
43
+ allow(::File).to receive(:directory?).with('/svc').and_return(true)
44
+ stub_const('Rails', double('Rails', :autoloaders => double(:main => loader)))
45
+ end
46
+
47
+ it 'does nothing when no path is configured' do
48
+ allow(described_class).to receive(:services_path).and_return(nil)
49
+ expect(::Protobuf::ServiceLoader).not_to receive(:load_services)
50
+ described_class.load_services(app)
51
+ end
52
+
53
+ it 'does nothing when the directory is missing' do
54
+ allow(::File).to receive(:directory?).with('/svc').and_return(false)
55
+ expect(::Protobuf::ServiceLoader).not_to receive(:load_services)
56
+ described_class.load_services(app)
57
+ end
58
+
59
+ it 'eager-loads through the autoloader when eager_load_dir is available' do
60
+ allow(loader).to receive(:respond_to?).with(:eager_load_dir).and_return(true)
61
+ expect(loader).to receive(:eager_load_dir).with('/svc')
62
+ expect(::Protobuf::ServiceLoader).not_to receive(:load_services)
63
+ described_class.load_services(app)
64
+ end
65
+
66
+ it 'falls back to ServiceLoader when eager_load_dir is unavailable' do
67
+ allow(loader).to receive(:respond_to?).with(:eager_load_dir).and_return(false)
68
+ expect(::Protobuf::ServiceLoader).to receive(:load_services).with('/svc')
69
+ described_class.load_services(app)
70
+ end
71
+
72
+ it 'falls back to ServiceLoader with the classic autoloader (no main loader)' do
73
+ stub_const('Rails', double('Rails', :autoloaders => double(:main => nil)))
74
+ expect(::Protobuf::ServiceLoader).to receive(:load_services).with('/svc')
75
+ described_class.load_services(app)
76
+ end
77
+
78
+ it 'falls back to ServiceLoader when the path is not autoloader-managed' do
79
+ stub_const('Zeitwerk::Error', Class.new(StandardError))
80
+ allow(loader).to receive(:respond_to?).with(:eager_load_dir).and_return(true)
81
+ allow(loader).to receive(:eager_load_dir).and_raise(::Zeitwerk::Error)
82
+ expect(::Protobuf::ServiceLoader).to receive(:load_services).with('/svc')
83
+ described_class.load_services(app)
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+ require SUPPORT_PATH.join('resource_service')
3
+
4
+ RSpec.describe Protobuf::Rpc::ApplicationService do
5
+ it 'is a subclass of Protobuf::Rpc::Service' do
6
+ expect(described_class.ancestors).to include(Protobuf::Rpc::Service)
7
+ end
8
+
9
+ it 'inherits Service class methods (host, port, configure)' do
10
+ expect(described_class).to respond_to(:host, :port, :configure, :rpc, :rpcs)
11
+ end
12
+
13
+ describe 'integration with implemented_services' do
14
+ let!(:app_subclass) do
15
+ Class.new(described_class) do
16
+ def self.name
17
+ 'ImplementedAppSubclassService'
18
+ end
19
+
20
+ rpc :find, Test::ResourceFindRequest, Test::Resource
21
+ def find; end
22
+ end
23
+ end
24
+
25
+ let!(:abstract_subclass) do
26
+ Class.new(described_class) do
27
+ def self.name
28
+ 'AbstractAppSubclassService'
29
+ end
30
+
31
+ rpc :find, Test::ResourceFindRequest, Test::Resource
32
+ # no #find method defined -> not "implemented"
33
+ end
34
+ end
35
+
36
+ after do
37
+ # `descendants` holds these classes until GC, which can run late. Remove
38
+ # the rpc method so other specs do not see this class as implemented.
39
+ app_subclass.send(:remove_method, :find)
40
+ end
41
+
42
+ it 'is discovered by Service.implemented_services (descendants traversal)' do
43
+ names = Protobuf::Rpc::Service.implemented_services
44
+ expect(names).to include('ImplementedAppSubclassService')
45
+ end
46
+
47
+ it 'omits subclasses with no implemented rpc methods' do
48
+ names = Protobuf::Rpc::Service.implemented_services
49
+ expect(names).not_to include('AbstractAppSubclassService')
50
+ end
51
+
52
+ it 'does not list the ApplicationService base itself' do
53
+ names = Protobuf::Rpc::Service.implemented_services
54
+ expect(names).not_to include(described_class.name)
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Protobuf::Rpc::ServiceFilters inheritance' do
4
+ let(:parent) do
5
+ Class.new do
6
+ include Protobuf::Rpc::ServiceFilters
7
+ end
8
+ end
9
+
10
+ def callables(klass, type)
11
+ klass.filters[type].map { |filter| filter[:callable] }
12
+ end
13
+
14
+ it 'copies the parent filters to a new subclass' do
15
+ parent.before_filter :authenticate
16
+ parent.around_filter :instrument
17
+ child = Class.new(parent)
18
+
19
+ expect(callables(child, :before)).to eq([:authenticate])
20
+ expect(callables(child, :around)).to eq([:instrument])
21
+ end
22
+
23
+ it 'does not add subclass filters to the parent' do
24
+ child = Class.new(parent)
25
+ child.before_filter :child_only
26
+
27
+ expect(callables(parent, :before)).to eq([])
28
+ end
29
+
30
+ it 'adds a filter that the parent defines later to existing subclasses' do
31
+ child = Class.new(parent)
32
+ grandchild = Class.new(child)
33
+ child.before_filter :child_only
34
+ parent.before_filter :shared
35
+
36
+ expect(callables(child, :before)).to eq([:child_only, :shared])
37
+ expect(callables(grandchild, :before)).to eq([:child_only, :shared])
38
+ end
39
+
40
+ it 'does not add the same filter two times to a subclass' do
41
+ parent.before_filter :authenticate
42
+ child = Class.new(parent)
43
+ child.before_filter :authenticate
44
+ parent.before_filter :authenticate
45
+
46
+ expect(callables(child, :before)).to eq([:authenticate])
47
+ end
48
+
49
+ describe 'rescue_from' do
50
+ let(:parent_handler) { ->(_service, _ex) {} }
51
+ let(:child_handler) { ->(_service, _ex) {} }
52
+
53
+ it 'copies the parent rescue filters to a new subclass' do
54
+ parent.rescue_from(ArgumentError, :with => parent_handler)
55
+ child = Class.new(parent)
56
+
57
+ expect(child.rescue_filters).to eq(ArgumentError => parent_handler)
58
+ end
59
+
60
+ it 'adds a rescue filter that the parent defines later to existing subclasses' do
61
+ child = Class.new(parent)
62
+ parent.rescue_from(ArgumentError, :with => parent_handler)
63
+
64
+ expect(child.rescue_filters).to eq(ArgumentError => parent_handler)
65
+ end
66
+
67
+ it 'keeps a handler that the subclass defined for the same exception class' do
68
+ child = Class.new(parent)
69
+ child.rescue_from(ArgumentError, :with => child_handler)
70
+ parent.rescue_from(ArgumentError, :with => parent_handler)
71
+
72
+ expect(child.rescue_filters[ArgumentError]).to eq(child_handler)
73
+ end
74
+
75
+ it 'replaces an inherited handler when the parent changes it' do
76
+ parent.rescue_from(ArgumentError, :with => child_handler)
77
+ child = Class.new(parent)
78
+ parent.rescue_from(ArgumentError, :with => parent_handler)
79
+
80
+ expect(child.rescue_filters[ArgumentError]).to eq(parent_handler)
81
+ end
82
+ end
83
+
84
+ it 'runs filters from Protobuf::Rpc::ApplicationService on a subclass' do
85
+ base = Class.new(Protobuf::Rpc::ApplicationService) do
86
+ before_filter :mark
87
+
88
+ def mark
89
+ @marked = true
90
+ end
91
+ end
92
+ service = Class.new(base) do
93
+ def marked?
94
+ @marked
95
+ end
96
+
97
+ def endpoint; end
98
+ end
99
+
100
+ instance = service.allocate
101
+ instance.__send__(:run_filters, :endpoint)
102
+
103
+ expect(instance).to be_marked
104
+ end
105
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+ require 'tmpdir'
3
+ require 'fileutils'
4
+ require 'protobuf/service_loader'
5
+
6
+ RSpec.describe Protobuf::ServiceLoader do
7
+ describe '.load_services' do
8
+ around do |example|
9
+ Dir.mktmpdir do |dir|
10
+ @services_dir = dir
11
+ example.run
12
+ end
13
+ end
14
+
15
+ let(:tracker) { [] }
16
+
17
+ before do
18
+ # Expose the tracker globally so the required files can reach it.
19
+ $service_loader_spec_tracker = tracker # rubocop:disable Style/GlobalVars
20
+ end
21
+
22
+ after do
23
+ $service_loader_spec_tracker = nil # rubocop:disable Style/GlobalVars
24
+ end
25
+
26
+ def write_service(relative_path, marker)
27
+ full = File.join(@services_dir, relative_path)
28
+ FileUtils.mkdir_p(File.dirname(full))
29
+ File.write(full, "$service_loader_spec_tracker << #{marker.inspect}\n")
30
+ full
31
+ end
32
+
33
+ it 'returns an empty array when path is nil' do
34
+ expect(described_class.load_services(nil)).to eq([])
35
+ end
36
+
37
+ it 'returns an empty array when directory does not exist' do
38
+ expect(described_class.load_services('/no/such/dir/here')).to eq([])
39
+ end
40
+
41
+ it 'loads every .rb file under the path' do
42
+ write_service('foo_service.rb', 'foo')
43
+ write_service('nested/bar_service.rb', 'bar')
44
+ write_service('helper.rb', 'helper')
45
+ write_service('notes.txt', 'nope')
46
+
47
+ described_class.load_services(@services_dir)
48
+
49
+ expect(tracker).to contain_exactly('foo', 'bar', 'helper')
50
+ end
51
+
52
+ it 'loads files in deterministic (sorted) order' do
53
+ write_service('b_service.rb', 'b')
54
+ write_service('a_service.rb', 'a')
55
+ write_service('c_service.rb', 'c')
56
+
57
+ described_class.load_services(@services_dir)
58
+
59
+ expect(tracker).to eq(%w[a b c])
60
+ end
61
+
62
+ it 'does not execute a file a second time on later calls' do
63
+ write_service('once_service.rb', 'one')
64
+
65
+ described_class.load_services(@services_dir)
66
+ described_class.load_services(@services_dir)
67
+
68
+ expect(tracker).to eq(%w[one])
69
+ end
70
+
71
+ it 'accepts a Pathname for the path' do
72
+ write_service('path_service.rb', 'path')
73
+
74
+ described_class.load_services(Pathname.new(@services_dir))
75
+
76
+ expect(tracker).to eq(['path'])
77
+ end
78
+
79
+ it 'honors a custom glob' do
80
+ write_service('foo_handler.rb', 'handler')
81
+ write_service('bar_service.rb', 'service')
82
+
83
+ described_class.load_services(@services_dir, '**/*_handler.rb')
84
+
85
+ expect(tracker).to eq(['handler'])
86
+ end
87
+ end
88
+ end
metadata CHANGED
@@ -1,17 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protobuf
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.10.9
4
+ version: 3.10.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - BJ Neilsen
8
8
  - Brandon Dewitt
9
9
  - Devin Christensen
10
10
  - Adam Hutchison
11
- autorequire:
12
11
  bindir: bin
13
12
  cert_chain: []
14
- date: 2024-01-12 00:00:00.000000000 Z
13
+ date: 2026-11-05 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: activesupport
@@ -19,14 +18,14 @@ dependencies:
19
18
  requirements:
20
19
  - - ">="
21
20
  - !ruby/object:Gem::Version
22
- version: '3.2'
21
+ version: '6.0'
23
22
  type: :runtime
24
23
  prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- version: '3.2'
28
+ version: '6.0'
30
29
  - !ruby/object:Gem::Dependency
31
30
  name: middleware
32
31
  requirement: !ruby/object:Gem::Requirement
@@ -69,6 +68,20 @@ dependencies:
69
68
  - - ">="
70
69
  - !ruby/object:Gem::Version
71
70
  version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: benchmark
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
72
85
  - !ruby/object:Gem::Dependency
73
86
  name: benchmark-ips
74
87
  requirement: !ruby/object:Gem::Requirement
@@ -97,6 +110,20 @@ dependencies:
97
110
  - - ">="
98
111
  - !ruby/object:Gem::Version
99
112
  version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: railties
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '6.0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '6.0'
100
127
  - !ruby/object:Gem::Dependency
101
128
  name: rake
102
129
  requirement: !ruby/object:Gem::Requirement
@@ -258,6 +285,8 @@ files:
258
285
  - lib/protobuf/message/fields.rb
259
286
  - lib/protobuf/message/serialization.rb
260
287
  - lib/protobuf/optionable.rb
288
+ - lib/protobuf/railtie.rb
289
+ - lib/protobuf/rpc/application_service.rb
261
290
  - lib/protobuf/rpc/buffer.rb
262
291
  - lib/protobuf/rpc/client.rb
263
292
  - lib/protobuf/rpc/connectors/base.rb
@@ -291,6 +320,7 @@ files:
291
320
  - lib/protobuf/rpc/service_dispatcher.rb
292
321
  - lib/protobuf/rpc/service_filters.rb
293
322
  - lib/protobuf/rpc/stat.rb
323
+ - lib/protobuf/service_loader.rb
294
324
  - lib/protobuf/socket.rb
295
325
  - lib/protobuf/tasks.rb
296
326
  - lib/protobuf/tasks/compile.rake
@@ -309,8 +339,11 @@ files:
309
339
  - spec/bin/protoc-gen-ruby_spec.rb
310
340
  - spec/encoding/all_types_spec.rb
311
341
  - spec/encoding/extreme_values_spec.rb
342
+ - spec/encoding/packed_decoding_spec.rb
343
+ - spec/encoding/wire_compat_decoding_spec.rb
312
344
  - spec/functional/class_inheritance_spec.rb
313
345
  - spec/functional/code_generator_spec.rb
346
+ - spec/functional/railtie_boot_spec.rb
314
347
  - spec/functional/socket_server_spec.rb
315
348
  - spec/functional/zmq_server_spec.rb
316
349
  - spec/lib/protobuf/cli_spec.rb
@@ -345,6 +378,8 @@ files:
345
378
  - spec/lib/protobuf/lifecycle_spec.rb
346
379
  - spec/lib/protobuf/message_spec.rb
347
380
  - spec/lib/protobuf/optionable_spec.rb
381
+ - spec/lib/protobuf/railtie_spec.rb
382
+ - spec/lib/protobuf/rpc/application_service_spec.rb
348
383
  - spec/lib/protobuf/rpc/client_spec.rb
349
384
  - spec/lib/protobuf/rpc/connectors/base_spec.rb
350
385
  - spec/lib/protobuf/rpc/connectors/ping_spec.rb
@@ -360,9 +395,11 @@ files:
360
395
  - spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb
361
396
  - spec/lib/protobuf/rpc/service_directory_spec.rb
362
397
  - spec/lib/protobuf/rpc/service_dispatcher_spec.rb
398
+ - spec/lib/protobuf/rpc/service_filters_inheritance_spec.rb
363
399
  - spec/lib/protobuf/rpc/service_filters_spec.rb
364
400
  - spec/lib/protobuf/rpc/service_spec.rb
365
401
  - spec/lib/protobuf/rpc/stat_spec.rb
402
+ - spec/lib/protobuf/service_loader_spec.rb
366
403
  - spec/lib/protobuf/varint_spec.rb
367
404
  - spec/lib/protobuf_spec.rb
368
405
  - spec/spec_helper.rb
@@ -401,7 +438,6 @@ homepage: https://github.com/localshred/protobuf
401
438
  licenses:
402
439
  - MIT
403
440
  metadata: {}
404
- post_install_message:
405
441
  rdoc_options: []
406
442
  require_paths:
407
443
  - lib
@@ -409,15 +445,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
409
445
  requirements:
410
446
  - - ">="
411
447
  - !ruby/object:Gem::Version
412
- version: '0'
448
+ version: '3.1'
413
449
  required_rubygems_version: !ruby/object:Gem::Requirement
414
450
  requirements:
415
451
  - - ">="
416
452
  - !ruby/object:Gem::Version
417
453
  version: '0'
418
454
  requirements: []
419
- rubygems_version: 3.2.33
420
- signing_key:
455
+ rubygems_version: 3.6.9
421
456
  specification_version: 4
422
457
  summary: Google Protocol Buffers serialization and RPC implementation for Ruby.
423
458
  test_files:
@@ -425,8 +460,11 @@ test_files:
425
460
  - spec/bin/protoc-gen-ruby_spec.rb
426
461
  - spec/encoding/all_types_spec.rb
427
462
  - spec/encoding/extreme_values_spec.rb
463
+ - spec/encoding/packed_decoding_spec.rb
464
+ - spec/encoding/wire_compat_decoding_spec.rb
428
465
  - spec/functional/class_inheritance_spec.rb
429
466
  - spec/functional/code_generator_spec.rb
467
+ - spec/functional/railtie_boot_spec.rb
430
468
  - spec/functional/socket_server_spec.rb
431
469
  - spec/functional/zmq_server_spec.rb
432
470
  - spec/lib/protobuf/cli_spec.rb
@@ -461,6 +499,8 @@ test_files:
461
499
  - spec/lib/protobuf/lifecycle_spec.rb
462
500
  - spec/lib/protobuf/message_spec.rb
463
501
  - spec/lib/protobuf/optionable_spec.rb
502
+ - spec/lib/protobuf/railtie_spec.rb
503
+ - spec/lib/protobuf/rpc/application_service_spec.rb
464
504
  - spec/lib/protobuf/rpc/client_spec.rb
465
505
  - spec/lib/protobuf/rpc/connectors/base_spec.rb
466
506
  - spec/lib/protobuf/rpc/connectors/ping_spec.rb
@@ -476,9 +516,11 @@ test_files:
476
516
  - spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb
477
517
  - spec/lib/protobuf/rpc/service_directory_spec.rb
478
518
  - spec/lib/protobuf/rpc/service_dispatcher_spec.rb
519
+ - spec/lib/protobuf/rpc/service_filters_inheritance_spec.rb
479
520
  - spec/lib/protobuf/rpc/service_filters_spec.rb
480
521
  - spec/lib/protobuf/rpc/service_spec.rb
481
522
  - spec/lib/protobuf/rpc/stat_spec.rb
523
+ - spec/lib/protobuf/service_loader_spec.rb
482
524
  - spec/lib/protobuf/varint_spec.rb
483
525
  - spec/lib/protobuf_spec.rb
484
526
  - spec/spec_helper.rb