nmax_cli 0.0.0

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,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7e6accd6271507af5f799533ff9534c8347aa63b5c152cb053bafa96ea2f3a5a
4
+ data.tar.gz: f4a36cdb53679dd8aa7abba00021d7638ed6482625994d4f52cd8a83b37d774c
5
+ SHA512:
6
+ metadata.gz: 7802233ca87d09266126a69043b6954e6d38037d64fac10f2838a4f10c0d617357fe020e7caf5251bae6b69f43a2d943fb28cbaa1d92f3b179b8674f74488770
7
+ data.tar.gz: 182b2bb39ebe771bee286905268f20a5f1b00e4b97d6c4a6d21d1c3dd4060eb93ebd4f368304485513164f80b6f9f60e825d24649648d48ad144e0ada13891fd
@@ -0,0 +1,2 @@
1
+ /test/sample_files
2
+ *.gem
@@ -0,0 +1,14 @@
1
+ # nmax
2
+ Output N maximum numbers from input stream
3
+
4
+ скрипт nmax, делает следующее:
5
+ * читает из входящего потока текстовые данные
6
+ * по завершении ввода выводит n самых больших целых чисел, встретившихся в полученных текстовых данных
7
+
8
+ Дополнительные указания:
9
+ * числом считается любая непрерывная последовательность цифр в тексте
10
+ * известно, что чисел длиннее 1000 цифр во входных данных нет
11
+ * число n должно быть единственным параметром скрипта
12
+ * код должен быть покрыт тестами
13
+ * код должен быть оформлен в виде гема (содержащего исполняемый файл, код модулей и т.д.)
14
+ * плюсом является размещение на Github и интеграция с Travis CI
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc 'Run tests'
8
+ task default: :test
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'nmax'
4
+ Nmax.run
@@ -0,0 +1,51 @@
1
+ module Nmax
2
+ class << self
3
+ def run
4
+ parameter_check
5
+ return if wrong_args?
6
+ @size = ARGV[0].to_i
7
+ @numbers = []
8
+
9
+ $stdin.each do |line|
10
+ add_nums_to_result nums(line)
11
+ end
12
+ puts '' if @numbers.empty?
13
+ puts @numbers
14
+ end
15
+
16
+ private
17
+
18
+ def parameter_check
19
+ warn 'Nmax must receive one argument (number). Example: nmax 100' if wrong_args?
20
+ end
21
+
22
+ def wrong_args?
23
+ ARGV.size != 1 || first_arg_not_number?
24
+ end
25
+
26
+ def first_arg_not_number?
27
+ !ARGV[0].match?(/^\d+$/)
28
+ end
29
+
30
+ def nums(line)
31
+ line.scan(/\d+/).map(&:to_i)
32
+ end
33
+
34
+ def add_nums_to_result(nums)
35
+ return if nums.empty?
36
+
37
+ nums.each { |n| add(n) }
38
+ end
39
+
40
+ def add(num)
41
+ insert_at = @numbers.bsearch_index { |n| num >= n }
42
+ @numbers.insert(insert_at, num) if insert_at
43
+ @numbers << num unless insert_at
44
+ shorten
45
+ end
46
+
47
+ def shorten
48
+ @numbers.pop if @numbers.size > @size
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,15 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'nmax_cli'
3
+ s.version = '0.0.0'
4
+ s.executables << 'nmax'
5
+ s.date = '2020-09-22'
6
+ s.summary = 'Nmax - Simple gem for search bigest integers from input stream'
7
+ s.description = 'Reads text data from the input stream; On completion of input,'\
8
+ ' prints the N largest integers encountered in the received text data.'\
9
+ 'Example: cat sample_data_40GB.txt | nmax 10000'
10
+ s.authors = ['Dmitrii Neverov']
11
+ s.email = 'dmi.neverov@gmail.com'
12
+ s.files = `git ls-files`.split("\n")
13
+ s.homepage = 'https://github.com/neverovda/nmax'
14
+ s.license = 'MIT'
15
+ end
@@ -0,0 +1,63 @@
1
+ require 'minitest/autorun'
2
+ require_relative '../lib/nmax.rb'
3
+
4
+ module TestNmaxHelper
5
+ def start(strings, argv)
6
+ io = StringIO.new
7
+ strings.each { |str| io.puts str}
8
+ io.rewind
9
+ $stdin = io
10
+ ARGV.replace argv
11
+ @out, @err = capture_io do
12
+ Nmax.run
13
+ end
14
+ end
15
+ end
16
+
17
+ class TestNmax < Minitest::Test
18
+ include TestNmaxHelper
19
+ attr_reader :out, :err
20
+ def setup
21
+ @strings = ['Lorem ipsum dolor sit amet, consectetur adipiscing elit...']
22
+ @argv = ['1']
23
+ @error_out = "Nmax must receive one argument (number). Example: nmax 100\n"
24
+ end
25
+
26
+ def test_without_numbers
27
+ start(@strings, @argv)
28
+ assert_equal("\n", out)
29
+ end
30
+
31
+ def test_with_one_number
32
+ strings = ['one1one']
33
+ start(strings, @argv)
34
+ assert_equal("1\n", out)
35
+ end
36
+
37
+ def test_largest_numbers
38
+ strings = ['L 1 ipsum 4 consectetur..1000',
39
+ 'Lorem 2 3000dolor am 3',
40
+ 'tetur 5 2000 elit']
41
+ argv = ['3']
42
+ start(strings, argv)
43
+ assert_equal("3000\n2000\n1000\n", out)
44
+ end
45
+
46
+ def test_arguments_empty
47
+ argv = []
48
+ start(@strings, argv)
49
+ assert_equal(@error_out, err)
50
+ end
51
+
52
+ def test_argument_not_number
53
+ argv = ['arg1']
54
+ start(@strings, argv)
55
+ assert_equal(@error_out, err)
56
+ end
57
+
58
+ def test_many_arguments
59
+ argv = ['100', 'arg']
60
+ start(@strings, argv)
61
+ assert_equal(@error_out, err)
62
+ end
63
+ end
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nmax_cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Dmitrii Neverov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-09-22 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: 'Reads text data from the input stream; On completion of input, prints
14
+ the N largest integers encountered in the received text data.Example: cat sample_data_40GB.txt
15
+ | nmax 10000'
16
+ email: dmi.neverov@gmail.com
17
+ executables:
18
+ - nmax
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - ".gitignore"
23
+ - README.md
24
+ - Rakefile
25
+ - bin/nmax
26
+ - lib/nmax.rb
27
+ - nmax.gemspec
28
+ - test/test_nmax.rb
29
+ homepage: https://github.com/neverovda/nmax
30
+ licenses:
31
+ - MIT
32
+ metadata: {}
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ requirements: []
48
+ rubygems_version: 3.1.2
49
+ signing_key:
50
+ specification_version: 4
51
+ summary: Nmax - Simple gem for search bigest integers from input stream
52
+ test_files: []