nmax-aoirgf 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
  SHA256:
3
- metadata.gz: 6c48d21d220cb287a4c039010a759a2bcfebc45b754e472f6b123955670280dd
4
- data.tar.gz: c0de8d7264c04dddef2d61b50956a8ee1db1d8548cbd722a0dfd8637638b8a7d
3
+ metadata.gz: 9da73431b6eb699aaa93643c6adee14810155f6af5e90e28e5537609ae364f6d
4
+ data.tar.gz: 7dd3b6dfcd0af4a90dc66a9b2e0c5ef716ff3552304211db2088f8b33271576c
5
5
  SHA512:
6
- metadata.gz: 49445802262660406eecabac10098b79e1bcd61e028a607a81f5e796f3af1bb578e77f4463e46d06d97cb4228e7de325c761e845258474745b524b83c96d193b
7
- data.tar.gz: dff76a1c773f037158f5440fce3a0931ddb6f77bcf14545233a6945309353f80de46170147440a5d1ac2dba50cec6b0767a12460f908717d23d1442052b14250
6
+ metadata.gz: 5869d956ab3265689153846e6dc87f1d74de6bae6c4640d8d71327bf654732b767717e32565d46635427772b3c9981e3c367610fa7b1929931c867190794b7cb
7
+ data.tar.gz: 7e665d6c19537c0b98270d56f7be7c4f50e18ee42d30f186a6f528c970672bdf120fd5f67f42e76176ad0fbaf7ba35f75484dc3040f168b8b8cfadd79b2e8173
data/CHANGELOG CHANGED
@@ -1,2 +1,6 @@
1
1
  == 0.1.0 / 2020-05-16
2
2
  * initial version
3
+ == 0.1.2 / 2020-05-16
4
+ * working version
5
+ == 0.1.3 / 2020-05-17
6
+ * optimized perfomance of stdin reading
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- nmax
1
+ nmax [![Build Status](https://travis-ci.org/r72cccp/nmax.svg?branch=master)](https://travis-ci.org/r72cccp/nmax)
2
2
  ====
3
3
 
4
4
  Ruby gem, reads text data from the input stream, upon completion of the input, displays the n largest integers,
@@ -9,7 +9,7 @@ usage
9
9
 
10
10
  Script runs from console with command:
11
11
  ```bash
12
- cat <filename> | ruby nmax.rb <limit_count>
12
+ cat <filename> | nmax <limit_count>
13
13
  ```
14
14
 
15
15
  Where
@@ -2,36 +2,67 @@
2
2
  require_relative './nmax_core'
3
3
 
4
4
  class NmaxReader
5
+ attr_reader :block_length
6
+
7
+ def initialize
8
+ @digit_buffer = ''
9
+ @block_length = 121
10
+ @data_size = 0
11
+ end
12
+
5
13
  def main
6
14
  raise ArgumentError, 'You must pass argument - maximum length of matches found.' if ARGV.length != 1
7
15
 
8
16
  capture_data(ARGV.first.to_i)
9
17
  end
10
18
 
11
- def capture_data(count_limit)
12
- block_length = 121
13
- data_size = 0
19
+ def capture_data(count_limit, verbose = false)
14
20
  maximum_numbers = NmaxCore.new(count_limit)
15
- digit_buffer = ''
16
21
 
17
22
  loop do
18
- block = $stdin.read(block_length)
23
+ block = $stdin.read(@block_length)
19
24
  break if block.empty?
20
25
 
21
- data_size += block.length
22
- print "\rReading: #{data_size}."
23
- block.each_char do |char|
24
- if char =~ /\d/
25
- digit_buffer << char
26
- elsif digit_buffer.length.positive?
27
- maximum_numbers.propose digit_buffer.to_i
28
- digit_buffer = ''
29
- end
26
+ @data_size += block.length
27
+
28
+ print "\rReading: #{@data_size}." if verbose
29
+ items = block.scan(/\d+/)
30
+
31
+ # Extreme cases.
32
+ # 1. If the entire read data block is a string
33
+ if items.empty? && !@digit_buffer.empty?
34
+ maximum_numbers.propose @digit_buffer.to_i
35
+ @digit_buffer = ''
36
+ end
37
+
38
+ # 2. If the entire block of read data is a number, add it to the buffer
39
+ if block =~ /^\d+$/
40
+ @digit_buffer << block
41
+ next
30
42
  end
31
43
 
32
- maximum_numbers.propose digit_buffer.to_i if digit_buffer.length.positive?
33
- break if block.length < block_length
44
+ # 3. If the first found number is the beginning of a block of read data - add it to the buffer and accept
45
+ if block =~ /^\d/ && !items.empty?
46
+ next if items.first.length == @block_length
47
+
48
+ @digit_buffer << items.first
49
+ maximum_numbers.propose @digit_buffer.to_i
50
+ @digit_buffer = ''
51
+ items.shift
52
+ end
53
+
54
+ # 4. If the last found number is the end of the block of read data - add it to the buffer
55
+ if block =~ /\d$/ && !items.empty?
56
+ @digit_buffer << items.last
57
+ items.pop
58
+ end
59
+
60
+ # Common, the remaining numbers found, if any, are accepted without buffering
61
+ items.each { |item| maximum_numbers.propose item.to_i } unless items.empty?
62
+
63
+ break if block.length < @block_length
34
64
  end
65
+ maximum_numbers.propose @digit_buffer.to_i if @digit_buffer.length.positive?
35
66
 
36
67
  puts "maximum_numbers.items: #{maximum_numbers.items.join(', ')}"
37
68
  maximum_numbers.items
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'nmax-aoirgf'
3
- s.version = '0.1.2'
3
+ s.version = '0.1.3'
4
4
  s.executables = ['nmax']
5
5
 
6
6
  s.authors = ['Sergio Belevskij']
@@ -16,8 +16,8 @@ Gem::Specification.new do |s|
16
16
  s.require_paths = ['lib']
17
17
 
18
18
  s.add_development_dependency 'rake', '12.3.3'
19
- s.add_development_dependency 'rspec', '3.9.1'
20
- s.add_development_dependency 'simplecov', '0.8.15'
19
+ s.add_development_dependency 'rspec', '3.5.0'
20
+ s.add_development_dependency 'simplecov'
21
21
 
22
22
  s.files = [
23
23
  'LICENSE',
@@ -30,5 +30,16 @@ RSpec.describe NmaxReader do
30
30
  $stdin = StringIO.new('Text with numbers: 555, 100500, 222, 333, 1001, 777')
31
31
  expect(reader_instance.capture_data(3)).to be == [777, 1001, 100_500]
32
32
  end
33
+
34
+ it 'must coverage case when while number found, next readed block is a string' do
35
+ $stdin = StringIO.new('t' * (reader_instance.block_length - 3) + '777' + 'ddd dff ' * 20)
36
+ expect(reader_instance.capture_data(1000).length).to be == 1
37
+ end
38
+
39
+ it 'must coverage case when next readed block is all number' do
40
+ length = reader_instance.block_length - 3
41
+ $stdin = StringIO.new('t' * length + '777' + '333' * length + '3434 sdf werfwe')
42
+ expect(reader_instance.capture_data(1000).length).to be == 1
43
+ end
33
44
  end
34
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nmax-aoirgf
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
  - Sergio Belevskij
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-16 00:00:00.000000000 Z
11
+ date: 2020-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 3.9.1
33
+ version: 3.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: 3.9.1
40
+ version: 3.5.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: simplecov
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.8.15
47
+ version: '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: 0.8.15
54
+ version: '0'
55
55
  description: Reads text data from the input stream. Upon completion of the input,
56
56
  displays the largest integers.
57
57
  email: bbelevskij@gmail.com