mimi-messaging 0.1.2 → 0.1.3

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
  SHA1:
3
- metadata.gz: efb706ab9b5c7aabdc045daae8c0bc853ec90ee0
4
- data.tar.gz: f2fea72a66862098269be871477f8944eee32057
3
+ metadata.gz: 99d219b26de0275984ae4a58a8ad2e87558db4a3
4
+ data.tar.gz: 2eb4e88a3bedabc884dd57eff6d9afe8971cbf45
5
5
  SHA512:
6
- metadata.gz: 19175272ba5d1668275ae9393c57aeec3da1910c8cb26c7680337639d8735824396655cf5fe0d8497a92a62984f901c5a9c0cbea46c4f60aa7dcf879bede40ff
7
- data.tar.gz: 53f9d5d8f5d5b74e96f8be48016a0ae693ba42fecd2d58550bf1ee25ee84e8cdfd711f434bae10b38c50a9442eaa0591b2da6fcfdb56aab62b2c34fcf4a09594
6
+ metadata.gz: 30b69c9b1945d0a65a3541d469034c36aac02769e95a276ade278bd26f9a1872d6e58ffbc0bd84c0387bd666f1fd293dda364fec73ee5d15b7f5c11b11f68b5e
7
+ data.tar.gz: 871493f0e32e1d2aeb488e875558ad192c065e105a785707180e67a76953680bcd68264e904fb9bfe77151e2733b907a423ef4851fae7d2c2bb1c338a6f428c4
@@ -0,0 +1,14 @@
1
+ #
2
+ # MessagePack extensions for common types
3
+ #
4
+ Mimi::Messaging::TypePacker.register(
5
+ Time,
6
+ from_bytes: -> (b) { Time.at(b.unpack('D').first).utc },
7
+ to_bytes: -> (v) { [v.utc.to_f].pack('D') }
8
+ )
9
+
10
+ Mimi::Messaging::TypePacker.register(
11
+ BigDecimal,
12
+ from_bytes: -> (b) { BigDecimal.new(b) },
13
+ to_bytes: -> (v) { v.to_s }
14
+ )
@@ -0,0 +1,104 @@
1
+ require 'msgpack'
2
+
3
+ module Mimi
4
+ module Messaging
5
+ class TypePacker
6
+ APPLICATION_TYPE_EXT = 0x00
7
+
8
+ # Registers a new type packer for msgpack.
9
+ #
10
+ # @example
11
+ # TypePacker.register(
12
+ # Time,
13
+ # from_bytes: -> (b) { Time.at(b.unpack('D').first) },
14
+ # to_bytes: -> (v) { [v.to_f].pack('D') }
15
+ # )
16
+ #
17
+ def self.register(type, opts = {})
18
+ raise ArgumentError, 'Invalid :from_bytes, proc expected' unless opts[:from_bytes].is_a?(Proc)
19
+ raise ArgumentError, 'Invalid :to_bytes, proc expected' unless opts[:to_bytes].is_a?(Proc)
20
+ type_name = type.to_s
21
+ params = opts.dup.merge(type: type, type_name: type_name)
22
+ type_packers[type] = params
23
+ type.send(:define_method, :to_msgpack_ext) { Mimi::Messaging::TypePacker.pack(self) }
24
+ MessagePack::DefaultFactory.register_type(
25
+ APPLICATION_TYPE_EXT,
26
+ type,
27
+ packer: :to_msgpack_ext
28
+ )
29
+
30
+ MessagePack::DefaultFactory.register_type(
31
+ APPLICATION_TYPE_EXT,
32
+ self,
33
+ unpacker: :unpack
34
+ )
35
+ end
36
+
37
+ # Returns a set of registered type packers
38
+ #
39
+ def self.type_packers
40
+ @type_packers ||= {}
41
+ end
42
+
43
+ # Pack a value using a type packer, registered for the value class
44
+ #
45
+ def self.pack(value)
46
+ type_packer = type_packers.values.find { |p| value.is_a?(p[:type]) }
47
+ raise "No packer registered for type #{value.class}" unless type_packer
48
+ bytes = type_packer[:to_bytes].call(value)
49
+ "#{type_packer[:type_name]}=#{bytes}"
50
+ end
51
+
52
+ # Unpack a value, using a registered type packer
53
+ #
54
+ def self.unpack(value)
55
+ type_name, _, bytes = value.partition('=') # splits "Type=bytes" into ['Type', '=', 'bytes']
56
+ type_packer = type_packers.values.find { |p| p[:type_name] == type_name }
57
+ raise "No unpacker registered for type #{type_name}" unless type_packer
58
+ type_packer[:from_bytes].call(bytes)
59
+ end
60
+
61
+ # def self.register_type_packer!
62
+ # return if @type_packer_registered
63
+ # # pk = MessagePack::Packer.new
64
+ # # pk.register_type(APPLICATION_TYPE_EXT) { |v| TypePacker.pack(v) }
65
+ # uk = MessagePack::Unpacker.new
66
+ # uk.register_type(APPLICATION_TYPE_EXT) { |b| TypePacker.unpack(b) }
67
+ # @type_packer_registered = true
68
+ # end
69
+ end # class TypePacker
70
+ end # module Messaging
71
+
72
+ end # module Mimi
73
+
74
+
75
+
76
+ # class A
77
+ # class B
78
+ # attr_reader :value
79
+ # def initialize(value)
80
+ # @value = value
81
+ # end
82
+ # end # class B
83
+ # end # class A
84
+
85
+ # TypePacker.register(
86
+ # Time,
87
+ # from_bytes: -> (b) { Time.at(b.unpack('D').first) },
88
+ # to_bytes: -> (v) { [v.to_f].pack('D') }
89
+ # )
90
+
91
+ # TypePacker.register(
92
+ # A::B,
93
+ # from_bytes: -> (b) { A::B.new(b.unpack('D').first) },
94
+ # to_bytes: -> (v) { [v.value.to_f].pack('D') }
95
+ # )
96
+
97
+ # TypePacker.register(
98
+ # DateTime,
99
+ # from_bytes: -> (b) { Time.at(b.unpack('D').first).to_datetime },
100
+ # to_bytes: -> (v) { [v.to_time.to_f].pack('D') }
101
+ # )
102
+
103
+ # m = "\x83\xA1a\xC7\r\x00Time=\x1D@\x95\xC7\x80\xCA\xD5A\xA1b\x02\xA1c\xC7\x11\x00DateTime=X@\x95\xC7\x80\xCA\xD5A"
104
+
@@ -1,5 +1,5 @@
1
1
  module Mimi
2
2
  module Messaging
3
- VERSION = '0.1.2'.freeze
3
+ VERSION = '0.1.3'.freeze
4
4
  end
5
5
  end
@@ -107,8 +107,6 @@ module Mimi
107
107
  end # module Mimi
108
108
 
109
109
  require_relative 'messaging/version'
110
- require_relative 'messaging/packer'
111
-
112
110
  require_relative 'messaging/errors'
113
111
  require_relative 'messaging/connection'
114
112
  require_relative 'messaging/message'
@@ -119,3 +117,5 @@ require_relative 'messaging/model'
119
117
  require_relative 'messaging/model_provider'
120
118
  require_relative 'messaging/notification'
121
119
  require_relative 'messaging/listener'
120
+ require_relative 'messaging/msgpack/type_packer'
121
+ require_relative 'messaging/msgpack/msgpack_ext'
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.require_paths = ['lib']
29
29
 
30
30
  spec.add_dependency 'mimi-core', '~> 0.1'
31
+ spec.add_dependency 'mimi-logger', '~> 0.1'
31
32
  spec.add_dependency 'bunny', '~> 2.3'
32
33
  spec.add_dependency 'msgpack', '~> 0.7'
33
34
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mimi-messaging
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Kukushkin
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mimi-logger
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bunny
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -132,8 +146,9 @@ files:
132
146
  - lib/mimi/messaging/message.rb
133
147
  - lib/mimi/messaging/model.rb
134
148
  - lib/mimi/messaging/model_provider.rb
149
+ - lib/mimi/messaging/msgpack/msgpack_ext.rb
150
+ - lib/mimi/messaging/msgpack/type_packer.rb
135
151
  - lib/mimi/messaging/notification.rb
136
- - lib/mimi/messaging/packer.rb
137
152
  - lib/mimi/messaging/provider.rb
138
153
  - lib/mimi/messaging/request.rb
139
154
  - lib/mimi/messaging/request_processor.rb
@@ -1,92 +0,0 @@
1
- require 'msgpack'
2
-
3
- class TypePacker
4
- APPLICATION_TYPE_EXT = 0x00
5
-
6
- def self.register(type, opts = {})
7
- raise ArgumentError, 'Invalid :from_bytes, proc expected' unless opts[:from_bytes].is_a?(Proc)
8
- raise ArgumentError, 'Invalid :to_bytes, proc expected' unless opts[:to_bytes].is_a?(Proc)
9
- type_name = type.to_s
10
- params = opts.dup.merge(type: type, type_name: type_name)
11
- type_packers[type] = params
12
- type.send(:define_method, :to_msgpack_ext) { TypePacker.pack(self) }
13
- MessagePack::DefaultFactory.register_type(
14
- APPLICATION_TYPE_EXT,
15
- type,
16
- packer: :to_msgpack_ext,
17
- # unpacker: :from_msgpack_ext
18
- )
19
-
20
- MessagePack::DefaultFactory.register_type(
21
- APPLICATION_TYPE_EXT,
22
- self,
23
- unpacker: :unpack,
24
- # unpacker: :from_msgpack_ext
25
- )
26
-
27
- # pk = MessagePack::Packer.new
28
- # pk.register_type(APPLICATION_TYPE_EXT, type, :to_msgpack_ext) # { |v| TypePacker.pack(v) }
29
-
30
- # register_type_packer!
31
- end
32
-
33
- def self.type_packers
34
- @type_packers ||= {}
35
- end
36
-
37
- def self.pack(value)
38
- type_packer = type_packers.values.find { |p| value.is_a?(p[:type]) }
39
- raise "No packer registered for type #{value.class}" unless type_packer
40
- bytes = type_packer[:to_bytes].call(value)
41
- "#{type_packer[:type_name]}=#{bytes}"
42
- end
43
-
44
- def self.unpack(value)
45
- vp = value.partition('=') # splits "Type=bytes" into ['Type', '=', 'bytes']
46
- type_name = vp.first
47
- bytes = vp.last
48
- type_packer = type_packers.values.find { |p| p[:type_name] == type_name }
49
- raise "No unpacker registered for type #{type_name}" unless type_packer
50
- type_packer[:from_bytes].call(bytes)
51
- end
52
-
53
- def self.register_type_packer!
54
- return if @type_packer_registered
55
- # pk = MessagePack::Packer.new
56
- # pk.register_type(APPLICATION_TYPE_EXT) { |v| TypePacker.pack(v) }
57
- uk = MessagePack::Unpacker.new
58
- uk.register_type(APPLICATION_TYPE_EXT) { |b| TypePacker.unpack(b) }
59
- @type_packer_registered = true
60
- end
61
- end # class TypePacker
62
-
63
-
64
- class A
65
- class B
66
- attr_reader :value
67
- def initialize(value)
68
- @value = value
69
- end
70
- end # class B
71
- end # class A
72
-
73
- TypePacker.register(
74
- Time,
75
- from_bytes: -> (b) { Time.at(b.unpack('D').first) },
76
- to_bytes: -> (v) { [v.to_f].pack('D') }
77
- )
78
-
79
- TypePacker.register(
80
- A::B,
81
- from_bytes: -> (b) { A::B.new(b.unpack('D').first) },
82
- to_bytes: -> (v) { [v.value.to_f].pack('D') }
83
- )
84
-
85
- # TypePacker.register(
86
- # DateTime,
87
- # from_bytes: -> (b) { Time.at(b.unpack('D').first).to_datetime },
88
- # to_bytes: -> (v) { [v.to_time.to_f].pack('D') }
89
- # )
90
-
91
- # m = "\x83\xA1a\xC7\r\x00Time=\x1D@\x95\xC7\x80\xCA\xD5A\xA1b\x02\xA1c\xC7\x11\x00DateTime=X@\x95\xC7\x80\xCA\xD5A"
92
-