nonnative 1.0.0 → 1.1.0

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
  SHA256:
3
- metadata.gz: 9c10339b1e71b31706b70b61c1107c2e1cfef46da91852f3d973065da3ab150c
4
- data.tar.gz: '0619ca746648a935a9b3904a5cc33f40bc324d1a66db289ed98466ed2207aa38'
3
+ metadata.gz: eca9151fff87535cc94a77e24cf243a3d0ed4203dc19c1d8bd5a6e31e604521e
4
+ data.tar.gz: 4cf14cbb4df0dca0740406c1667742b171238ace67463f51387464cd5f2cf9cd
5
5
  SHA512:
6
- metadata.gz: dfb30c7fd56bd14dc6d4fb8bddc1770a1afee0feeb79e99992510464401fff9953415433b9b139bb2725a264d6749e9d6eaeb868b7d0f29a7d20656e871eabf8
7
- data.tar.gz: d0fd3db73e4b91c419bae57cb76c0d1a10e7d7a17310c16dad6fb82e49eefab87a533ca32c6cfa7cb44ca505742a33c4b83e0bde024d9dcba3457578a6f295c4
6
+ metadata.gz: 5b90f1d35bfbd4edb311a308d39d20711b3cf53b03101a554a088cac1719f6b53cc57f629f862dae4bd7063e8be5413b948edb5c952ee929ef971cdfce804d4b
7
+ data.tar.gz: 2df440113fda404d2a140909b8d2b3ae5a37e6c50619f9a6a29e26d5f7cff4abaf84fe7f1e879d5f592d5a353a9281e2612a33c3c28a0227f7658f0153a0d5c6
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nonnative (1.0.0)
4
+ nonnative (1.1.0)
5
5
  cucumber
6
6
  rspec-expectations
7
7
  semantic_logger
data/README.md CHANGED
@@ -46,15 +46,15 @@ require 'nonnative'
46
46
  Nonnative.configure do |config|
47
47
  config.strategy = :startup or :before or :manual
48
48
 
49
- config.definition do |d|
50
- d.process = 'features/support/bin/start 12_321'
49
+ config.process do |d|
50
+ d.command = 'features/support/bin/start 12_321'
51
51
  d.timeout = 0.5
52
52
  d.port = 12_321
53
53
  d.file = 'features/logs/12_321.log'
54
54
  end
55
55
 
56
- config.definition do |d|
57
- d.process = 'features/support/bin/start 12_322'
56
+ config.process do |d|
57
+ d.command = 'features/support/bin/start 12_322'
58
58
  d.timeout = 0.5
59
59
  d.port = 12_322
60
60
  d.file = 'features/logs/12_322.log'
@@ -67,14 +67,14 @@ end
67
67
  ```yaml
68
68
  version: 1.0
69
69
  strategy: manual
70
- definitions:
70
+ processes:
71
71
  -
72
- process: features/support/bin/start 12_321
72
+ command: features/support/bin/start 12_321
73
73
  timeout: 5
74
74
  port: 12321
75
75
  file: features/logs/12_321.log
76
76
  -
77
- process: features/support/bin/start 12_322
77
+ command: features/support/bin/start 12_322
78
78
  timeout: 5
79
79
  port: 12322
80
80
  file: features/logs/12_322.log
@@ -2,14 +2,15 @@
2
2
 
3
3
  require 'socket'
4
4
  require 'timeout'
5
+ require 'yaml'
5
6
 
6
7
  require 'nonnative/version'
7
8
  require 'nonnative/error'
8
- require 'nonnative/configuration'
9
- require 'nonnative/definition'
10
- require 'nonnative/process'
11
- require 'nonnative/process_pool'
12
- require 'nonnative/port'
9
+ require 'nonnative/configuration/object'
10
+ require 'nonnative/configuration/process'
11
+ require 'nonnative/process/system'
12
+ require 'nonnative/process/pool'
13
+ require 'nonnative/process/port'
13
14
  require 'nonnative/logger'
14
15
 
15
16
  module Nonnative
@@ -19,11 +20,11 @@ module Nonnative
19
20
  end
20
21
 
21
22
  def load_configuration(path)
22
- @configuration ||= Nonnative::Configuration.load_file(path) # rubocop:disable Naming/MemoizedInstanceVariableName
23
+ @configuration ||= Nonnative::Configuration::Object.load_file(path) # rubocop:disable Naming/MemoizedInstanceVariableName
23
24
  end
24
25
 
25
26
  def configuration
26
- @configuration ||= Nonnative::Configuration.new
27
+ @configuration ||= NNonnative::Configuration::Object.new
27
28
  end
28
29
 
29
30
  def configure
@@ -33,7 +34,7 @@ module Nonnative
33
34
  end
34
35
 
35
36
  def start
36
- @process_pool ||= Nonnative::ProcessPool.new(configuration)
37
+ @process_pool ||= Nonnative::Process::Pool.new(configuration)
37
38
 
38
39
  @process_pool.start do |pid, result|
39
40
  logger.error('Process has started though did respond in time', pid: pid) unless result
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nonnative
4
+ module Configuration
5
+ class Object
6
+ class << self
7
+ def load_file(path)
8
+ file = YAML.load_file(path)
9
+
10
+ new.tap do |c|
11
+ c.strategy = file['strategy']
12
+
13
+ processes(file, c)
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def processes(file, config)
20
+ file['processes'].each do |fd|
21
+ config.process do |d|
22
+ d.command = fd['command']
23
+ d.timeout = fd['timeout']
24
+ d.port = fd['port']
25
+ d.file = fd['file']
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ def initialize
32
+ self.strategy = :before
33
+ self.processes = []
34
+ end
35
+
36
+ attr_accessor :strategy
37
+ attr_accessor :processes
38
+
39
+ def process
40
+ process = Nonnative::Configuration::Process.new
41
+ yield process
42
+
43
+ processes << process
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nonnative
4
+ module Configuration
5
+ class Process
6
+ attr_accessor :command
7
+ attr_accessor :timeout
8
+ attr_accessor :port
9
+ attr_accessor :file
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nonnative
4
+ module Process
5
+ class Pool
6
+ def initialize(configuration)
7
+ @configuration = configuration
8
+ end
9
+
10
+ def start(&block)
11
+ prs = processes.map { |p, _| p.start }
12
+ pos = processes.map { |_, p| Thread.new { p.open? } }.map(&:value)
13
+
14
+ yield_results(prs, pos, &block)
15
+ end
16
+
17
+ def stop(&block)
18
+ prs = processes.map { |p, _| p.stop }
19
+ pos = processes.map { |_, p| Thread.new { p.closed? } }.map(&:value)
20
+
21
+ yield_results(prs, pos, &block)
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :configuration
27
+
28
+ def processes
29
+ @processes ||= configuration.processes.map do |d|
30
+ [Nonnative::Process::System.new(d), Nonnative::Process::Port.new(d)]
31
+ end
32
+ end
33
+
34
+ def yield_results(prs, pos)
35
+ prs.zip(pos).each do |pid, result|
36
+ yield pid, result
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nonnative
4
+ module Process
5
+ class Port
6
+ def initialize(process)
7
+ @process = process
8
+ end
9
+
10
+ def open?
11
+ timeout do
12
+ open_socket
13
+ true
14
+ rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
15
+ sleep_interval
16
+ retry
17
+ end
18
+ end
19
+
20
+ def closed?
21
+ timeout do
22
+ open_socket
23
+ raise Nonnative::Error
24
+ rescue Nonnative::Error
25
+ sleep_interval
26
+ retry
27
+ rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ECONNRESET
28
+ true
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :process
35
+
36
+ def timeout
37
+ Timeout.timeout(process.timeout) do
38
+ yield
39
+ end
40
+ rescue Timeout::Error
41
+ false
42
+ end
43
+
44
+ def open_socket
45
+ TCPSocket.new('127.0.0.1', process.port).close
46
+ end
47
+
48
+ def sleep_interval
49
+ sleep 0.01
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nonnative
4
+ module Process
5
+ class System
6
+ def initialize(process)
7
+ @process = process
8
+ @started = false
9
+ end
10
+
11
+ def start
12
+ unless started
13
+ @pid = spawn(process.command, %i[out err] => [process.file, 'a'])
14
+ @started = true
15
+ end
16
+
17
+ pid
18
+ end
19
+
20
+ def stop
21
+ raise Nonnative::Error, "Can't stop a process that has not started" unless started
22
+
23
+ ::Process.kill('SIGINT', pid)
24
+ @started = false
25
+
26
+ pid
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :process, :pid, :started
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nonnative
4
- VERSION = '1.0.0'
4
+ VERSION = '1.1.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nonnative
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Falkowski
@@ -158,14 +158,14 @@ files:
158
158
  - bin/setup
159
159
  - lib/nonnative.rb
160
160
  - lib/nonnative/before.rb
161
- - lib/nonnative/configuration.rb
162
- - lib/nonnative/definition.rb
161
+ - lib/nonnative/configuration/object.rb
162
+ - lib/nonnative/configuration/process.rb
163
163
  - lib/nonnative/error.rb
164
164
  - lib/nonnative/logger.rb
165
165
  - lib/nonnative/manual.rb
166
- - lib/nonnative/port.rb
167
- - lib/nonnative/process.rb
168
- - lib/nonnative/process_pool.rb
166
+ - lib/nonnative/process/pool.rb
167
+ - lib/nonnative/process/port.rb
168
+ - lib/nonnative/process/system.rb
169
169
  - lib/nonnative/startup.rb
170
170
  - lib/nonnative/version.rb
171
171
  - nonnative.gemspec
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nonnative
4
- class Configuration
5
- class << self
6
- def load_file(path)
7
- file = YAML.load_file(path)
8
-
9
- new.tap do |c|
10
- c.strategy = file['strategy']
11
-
12
- definitions(file, c)
13
- end
14
- end
15
-
16
- private
17
-
18
- def definitions(file, config)
19
- file['definitions'].each do |fd|
20
- config.definition do |d|
21
- d.process = fd['process']
22
- d.timeout = fd['timeout']
23
- d.port = fd['port']
24
- d.file = fd['file']
25
- end
26
- end
27
- end
28
- end
29
-
30
- def initialize
31
- self.strategy = :before
32
- self.definitions = []
33
- end
34
-
35
- attr_accessor :strategy
36
- attr_accessor :definitions
37
-
38
- def definition
39
- definition = Nonnative::Definition.new
40
- yield definition
41
-
42
- definitions << definition
43
- end
44
- end
45
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nonnative
4
- class Definition
5
- attr_accessor :process
6
- attr_accessor :timeout
7
- attr_accessor :port
8
- attr_accessor :file
9
- end
10
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nonnative
4
- class Port
5
- def initialize(definition)
6
- @definition = definition
7
- end
8
-
9
- def open?
10
- timeout do
11
- open_socket
12
- true
13
- rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
14
- sleep_interval
15
- retry
16
- end
17
- end
18
-
19
- def closed?
20
- timeout do
21
- open_socket
22
- raise Nonnative::Error
23
- rescue Nonnative::Error
24
- sleep_interval
25
- retry
26
- rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ECONNRESET
27
- true
28
- end
29
- end
30
-
31
- private
32
-
33
- attr_reader :definition
34
-
35
- def timeout
36
- Timeout.timeout(definition.timeout) do
37
- yield
38
- end
39
- rescue Timeout::Error
40
- false
41
- end
42
-
43
- def open_socket
44
- TCPSocket.new('127.0.0.1', definition.port).close
45
- end
46
-
47
- def sleep_interval
48
- sleep 0.01
49
- end
50
- end
51
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nonnative
4
- class Process
5
- def initialize(definition)
6
- @definition = definition
7
- @started = false
8
- end
9
-
10
- def start
11
- unless started
12
- @pid = spawn(definition.process, %i[out err] => [definition.file, 'a'])
13
- @started = true
14
- end
15
-
16
- pid
17
- end
18
-
19
- def stop
20
- raise Nonnative::Error, "Can't stop a process that has not started" unless started
21
-
22
- ::Process.kill('SIGINT', pid)
23
- @started = false
24
-
25
- pid
26
- end
27
-
28
- private
29
-
30
- attr_reader :definition, :pid, :started
31
- end
32
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nonnative
4
- class ProcessPool
5
- def initialize(configuration)
6
- @configuration = configuration
7
- end
8
-
9
- def start(&block)
10
- prs = processes.map { |p, _| p.start }
11
- pos = processes.map { |_, p| Thread.new { p.open? } }.map(&:value)
12
-
13
- yield_results(prs, pos, &block)
14
- end
15
-
16
- def stop(&block)
17
- prs = processes.map { |p, _| p.stop }
18
- pos = processes.map { |_, p| Thread.new { p.closed? } }.map(&:value)
19
-
20
- yield_results(prs, pos, &block)
21
- end
22
-
23
- private
24
-
25
- attr_reader :configuration
26
-
27
- def processes
28
- @processes ||= configuration.definitions.map { |d| [Nonnative::Process.new(d), Nonnative::Port.new(d)] }
29
- end
30
-
31
- def yield_results(prs, pos)
32
- prs.zip(pos).each do |pid, result|
33
- yield pid, result
34
- end
35
- end
36
- end
37
- end