io_request 1.2.0 → 2.3.1

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,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IORequest
4
+ # Utility methods.
5
+ module Utility
6
+ # Extended Id of object
7
+ class ExtendedID
8
+ include Comparable
9
+
10
+ # Create new Id based on PID, thread ID and object ID.
11
+ def initialize(pid = nil, tid = nil, oid = nil)
12
+ @pid = pid || Process.pid
13
+ @tid = tid || Thread.current.object_id
14
+ @oid = oid || object_id
15
+ end
16
+
17
+ # @return [Integer] process ID.
18
+ attr_reader :pid
19
+
20
+ # @return [Integer] thread ID.
21
+ attr_reader :tid
22
+
23
+ # @return [Integer] object ID.
24
+ attr_reader :oid
25
+
26
+ # @return [String]
27
+ def to_s
28
+ "#{@pid}##{@tid}##{@oid}"
29
+ end
30
+
31
+ # Comparison operator.
32
+ def <=>(other)
33
+ if @pid == other.pid && @tid == other.tid
34
+ @oid <=> other.oid
35
+ elsif @pid == other.pid && @tid != other.tid
36
+ @tid <=> tid
37
+ else
38
+ @pid <=> other.pid
39
+ end
40
+ end
41
+
42
+ def self.from(obj)
43
+ case obj
44
+ when ExtendedID then new(obj.pid, obj.tid, obj.oid)
45
+ when String then new(*obj.split('#').map(&:to_i))
46
+ else
47
+ raise 'unknown type'
48
+ end
49
+ end
50
+ end
51
+ # Adds special method to return object ID.
52
+ module WithID
53
+ # Identifies object in thread and process.
54
+ def __with_id__extended_id
55
+ @__with_id__extended_id ||= ExtendedID.new
56
+ end
57
+ alias extended_id __with_id__extended_id
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IORequest
4
+ # Utility methods.
5
+ module Utility
6
+ # Adds special method to identify object in log files.
7
+ module WithProgName
8
+ # Identifies object and thread it runs in.
9
+ def prog_name
10
+ "#{self.class.name}##{object_id} in Thread##{Thread.current.object_id}"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module IORequest
2
4
  # Gem version.
3
- VERSION = "1.2.0"
5
+ VERSION = '2.3.1'
4
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: io_request
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fizvlad
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-04 00:00:00.000000000 Z
11
+ date: 2020-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -25,75 +25,75 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '13.0'
33
+ version: '5.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '13.0'
40
+ version: '5.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: minitest
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '5.0'
47
+ version: '13.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '5.0'
54
+ version: '13.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: logger
56
+ name: json
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.4'
61
+ version: '2.0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.4'
68
+ version: '2.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: timeout-extensions
70
+ name: logger
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.1.1
75
+ version: '1.4'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.1.1
82
+ version: '1.4'
83
83
  - !ruby/object:Gem::Dependency
84
- name: json
84
+ name: timeout-extensions
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '2.0'
89
+ version: 0.1.1
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '2.0'
96
+ version: 0.1.1
97
97
  description:
98
98
  email:
99
99
  - fizvlad@mail.ru
@@ -102,20 +102,24 @@ extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
104
  - ".gitignore"
105
+ - ".rubocop.yml"
106
+ - ".rubocop_todo.yml"
105
107
  - ".travis.yml"
106
108
  - Gemfile
107
- - Gemfile.lock
108
109
  - LICENSE.txt
109
110
  - README.md
110
111
  - Rakefile
111
112
  - bin/console
112
- - examples/simple_example.rb
113
113
  - io_request.gemspec
114
114
  - lib/io_request.rb
115
+ - lib/io_request/authorizer.rb
115
116
  - lib/io_request/client.rb
117
+ - lib/io_request/connection/ssl_sockets.rb
116
118
  - lib/io_request/logging.rb
117
119
  - lib/io_request/message.rb
118
- - lib/io_request/utility.rb
120
+ - lib/io_request/utility/multi_thread.rb
121
+ - lib/io_request/utility/with_id.rb
122
+ - lib/io_request/utility/with_prog_name.rb
119
123
  - lib/io_request/version.rb
120
124
  homepage: https://github.com/fizvlad/io-request-rb
121
125
  licenses:
@@ -132,14 +136,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
136
  requirements:
133
137
  - - ">="
134
138
  - !ruby/object:Gem::Version
135
- version: 2.3.1
139
+ version: 2.6.5
136
140
  required_rubygems_version: !ruby/object:Gem::Requirement
137
141
  requirements:
138
142
  - - ">="
139
143
  - !ruby/object:Gem::Version
140
144
  version: '0'
141
145
  requirements: []
142
- rubygems_version: 3.0.4
146
+ rubygems_version: 3.1.0.pre2
143
147
  signing_key:
144
148
  specification_version: 4
145
149
  summary: Small gem to create JSON request/response type of connection over IO object
@@ -1,29 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- io_request (1.2.0)
5
- json (~> 2.0)
6
- logger (~> 1.4)
7
- timeout-extensions (~> 0.1.1)
8
-
9
- GEM
10
- remote: https://rubygems.org/
11
- specs:
12
- json (2.3.0)
13
- logger (1.4.1)
14
- minitest (5.13.0)
15
- rake (13.0.1)
16
- timeout-extensions (0.1.1)
17
-
18
- PLATFORMS
19
- ruby
20
- x64-mingw32
21
-
22
- DEPENDENCIES
23
- bundler (~> 2.0)
24
- io_request!
25
- minitest (~> 5.0)
26
- rake (~> 13.0)
27
-
28
- BUNDLED WITH
29
- 2.0.2
@@ -1,52 +0,0 @@
1
- require "io_request"
2
-
3
- r1, w1 = IO.pipe
4
- r2, w2 = IO.pipe
5
-
6
- client_1 = IORequest::Client.new read: r1, write: w2
7
- client_2 = IORequest::Client.new read: r2, write: w1
8
-
9
- # Use
10
- # Set up responders
11
- # Authorization
12
- client_2.respond type: "auth" do |request|
13
- puts "Client 2: Authorization attempt as #{request.data[:username].inspect}"
14
- sleep 2 # Some processing
15
- { type: "auth_success" }
16
- end
17
-
18
- # Default
19
- client_2.respond do |request|
20
- puts "Client 2: #{request.data.inspect}"
21
- { type: "success" }
22
- end
23
-
24
- # Send requests
25
- auth = false
26
- auth_request = client_1.request(
27
- data: { type: "auth", username: "mymail@example.com", password: "let's pretend password hash is here" },
28
- sync: true
29
- ) do |response|
30
- unless response.data[:type] == "auth_success"
31
- puts "Client 1: Authorization failed. Response: #{response.data.inspect}"
32
- next
33
- end
34
-
35
- auth = true
36
- # Do something
37
- end
38
- exit unless auth
39
- puts "Client 1: Authorized!"
40
-
41
- message = client_1.request(
42
- data: { type: "message", message: "Hello!" },
43
- sync: true
44
- ) do |response|
45
- puts "Client 1: Message responded"
46
- end
47
-
48
- # Close
49
- r1.close
50
- w1.close
51
- r2.close
52
- w2.close
@@ -1,104 +0,0 @@
1
- module IORequest
2
- # Utility methods.
3
- module Utility
4
- # Adds special method to identify object in log files.
5
- module WithProgName
6
- ##
7
- # Identifies object and thread it runs in.
8
- def prog_name
9
- self_class = self.class
10
- "#{self_class.name}##{object_id} in Thread##{Thread.current.object_id}"
11
- end
12
- end
13
-
14
- # Adds some methods to spawn new threads and join them.
15
- #
16
- # @note This module creates instance variables with prefix +@_MultiThread_+.
17
- module MultiThread
18
- private
19
-
20
- # @return [Array<Thread>] array of running threads
21
- def running_threads
22
- @_MultiThread_threads ||= []
23
- end
24
-
25
- # Runs block with provided arguments forwarded as arguments in separate thread.
26
- #
27
- # All the inline args will be passed to block.
28
- #
29
- # @param thread_name [String] thread name.
30
- #
31
- # @return [Thread]
32
- def in_thread(*args, name: nil, &block)
33
- @_MultiThread_threads ||= []
34
- @_MultiThread_mutex ||= Mutex.new
35
- # Synchronizing addition/deletion of new threads. That's important
36
- @_MultiThread_mutex.synchronize do
37
- new_thread = Thread.new(*args) do |*in_args|
38
- begin
39
- block.call(*in_args)
40
- ensure
41
- @_MultiThread_mutex.synchronize do
42
- @_MultiThread_threads.delete(Thread.current)
43
- end
44
- end
45
- end
46
- @_MultiThread_threads << new_thread
47
- new_thread.name = name if name
48
- new_thread
49
- end
50
- end
51
-
52
- # For each running thread.
53
- def each_thread(&block)
54
- @_MultiThread_threads ||= []
55
-
56
- @_MultiThread_threads.each(&block)
57
- end
58
-
59
- # Kills each thread.
60
- def kill_threads
61
- each_thread(&:kill)
62
- each_thread(&:join)
63
- end
64
-
65
- # Joins each thread.
66
- def join_threads
67
- each_thread(&:join)
68
- end
69
- end
70
- end
71
- end
72
-
73
- # Extending Hash class.
74
- class Hash
75
- # Use this on JSON objects to turn all the +String+ keys of hash to symbols.
76
- #
77
- # @param depth [Integer] maximum amount of hashes to handle. This is just a
78
- # simple way to protect from infinite loop.
79
- #
80
- # @return [self]
81
- def symbolize_keys!(depth = 1000)
82
- queue = [self]
83
- count = 0
84
- while h = queue.shift
85
- h.transform_keys! { |key| key.is_a?(String) ? key.to_sym : key }
86
- h.each_value { |v| queue.push(v) if v.is_a?(Hash) }
87
- count += 1
88
- break if count >= depth
89
- end
90
- self
91
- end
92
-
93
- # Whether provided hash is included into this one.
94
- #
95
- # @param other [Hash]
96
- #
97
- # @return [Boolean]
98
- def contains?(other)
99
- other.keys.all? do |key|
100
- other[key] == self[key]
101
- end
102
- end
103
- end
104
-