rslog 0.0.1 → 0.0.6
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.
- checksums.yaml +4 -4
- data/lib/rslog.rb +2 -1
- data/lib/rslog/container.rb +10 -0
- data/lib/rslog/data_parser.rb +4 -2
- data/lib/rslog/extractor.rb +9 -6
- data/lib/rslog/input_parser.rb +8 -36
- data/lib/rslog/opts.rb +29 -0
- data/lib/rslog/presenter.rb +24 -10
- data/lib/rslog/tools/array.rb +3 -5
- data/lib/rslog/tools/hash.rb +12 -3
- data/lib/rslog/validator.rb +2 -0
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a26949293916af6f26eb0300e97d44064497fa34fee36fe4e1d4ac99be349261
|
|
4
|
+
data.tar.gz: b552d5991eacc558ea2b3329c353afddddbb04ab1d59329bc5d4607fcce1410e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b1337290f869ff04b969a948aa7e68ec590051018c1939f4d8c1cd4eae255fafa79690a263eb8e77bf7dfba7faf49d2f9af718657cdd90486ff14768b345221e
|
|
7
|
+
data.tar.gz: 82d5826eb5539accd1e2f886705c8d0bd8709995d6d4a09a147906b44e69fd0e9701943a1fcb2ae35af08e46c1cbe3b1c18e32fa866ac81237518597bab0338a
|
data/lib/rslog.rb
CHANGED
|
@@ -7,12 +7,13 @@ require_relative 'rslog/extractor'
|
|
|
7
7
|
require_relative 'rslog/validator'
|
|
8
8
|
require_relative 'rslog/data_parser'
|
|
9
9
|
require_relative 'rslog/presenter'
|
|
10
|
+
require_relative 'rslog/opts'
|
|
10
11
|
|
|
11
12
|
# For development
|
|
12
13
|
# require 'pry'
|
|
13
14
|
|
|
14
15
|
class RSlog
|
|
15
|
-
VERSION = '0.0.
|
|
16
|
+
VERSION = '0.0.6'
|
|
16
17
|
|
|
17
18
|
def self.run
|
|
18
19
|
Container.new.process_all
|
data/lib/rslog/container.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# Class to hold data and implement processing
|
|
4
|
+
|
|
3
5
|
class Container
|
|
4
6
|
attr_accessor(*%i[
|
|
5
7
|
argv file_name messages errors data options validator types result
|
|
@@ -23,6 +25,14 @@ class Container
|
|
|
23
25
|
def no_errors?
|
|
24
26
|
errors.empty?
|
|
25
27
|
end
|
|
28
|
+
|
|
29
|
+
def add_message(str)
|
|
30
|
+
self.messages << str
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def add_error(str)
|
|
34
|
+
self.errors << str
|
|
35
|
+
end
|
|
26
36
|
|
|
27
37
|
def talk
|
|
28
38
|
puts messages.join("\n")
|
data/lib/rslog/data_parser.rb
CHANGED
|
@@ -6,6 +6,8 @@ require_relative 'validator'
|
|
|
6
6
|
|
|
7
7
|
require 'pry'
|
|
8
8
|
|
|
9
|
+
# Class to parse data from given array
|
|
10
|
+
#
|
|
9
11
|
class DataParser
|
|
10
12
|
# type = :count (default) -> just count in groups
|
|
11
13
|
# type = :uniq -> uniq entries in groups
|
|
@@ -17,11 +19,11 @@ class DataParser
|
|
|
17
19
|
@container.result =
|
|
18
20
|
@container.data
|
|
19
21
|
.group_by_index(0)
|
|
20
|
-
.
|
|
22
|
+
.send("count_by_groups_#{type.to_s}")
|
|
21
23
|
.to_a
|
|
22
24
|
.sort_by { |item| item[1] }
|
|
23
25
|
.reverse
|
|
24
|
-
.map { |
|
|
26
|
+
.map { |elem_arr| elem_arr.map(&:to_s).join(' ') }
|
|
25
27
|
self
|
|
26
28
|
end
|
|
27
29
|
end
|
data/lib/rslog/extractor.rb
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative 'container'
|
|
4
4
|
|
|
5
|
+
# Class for extracting data from file
|
|
6
|
+
#
|
|
5
7
|
class Extractor
|
|
6
8
|
def initialize(container)
|
|
7
9
|
@container = container
|
|
10
|
+
@file_name = container.file_name
|
|
8
11
|
end
|
|
9
12
|
|
|
10
13
|
def execute
|
|
@@ -15,13 +18,13 @@ class Extractor
|
|
|
15
18
|
private
|
|
16
19
|
|
|
17
20
|
def check
|
|
18
|
-
if File.zero?(@
|
|
19
|
-
@container.
|
|
21
|
+
if File.zero?(@file_name)
|
|
22
|
+
@container.add_message 'Empty file'
|
|
20
23
|
else
|
|
21
|
-
@container.data = File.open(@
|
|
22
|
-
@container.
|
|
24
|
+
@container.data = File.open(@file_name, 'r').to_a
|
|
25
|
+
@container.add_message 'Data in place'
|
|
23
26
|
end
|
|
24
|
-
rescue StandardError =>
|
|
25
|
-
@container.
|
|
27
|
+
rescue StandardError => error
|
|
28
|
+
@container.add_error error
|
|
26
29
|
end
|
|
27
30
|
end
|
data/lib/rslog/input_parser.rb
CHANGED
|
@@ -1,35 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'optparse'
|
|
4
|
+
require_relative 'opts'
|
|
4
5
|
|
|
6
|
+
# Class to parse input filenames and args
|
|
7
|
+
#
|
|
5
8
|
class InputParser
|
|
6
|
-
|
|
7
|
-
version: {
|
|
8
|
-
descr: ['-v', '--version', 'Show version and exit'],
|
|
9
|
-
action: proc do
|
|
10
|
-
puts "#{File.basename($PROGRAM_NAME)}: #{RSlog::VERSION}"
|
|
11
|
-
exit
|
|
12
|
-
end
|
|
13
|
-
},
|
|
14
|
-
help: {
|
|
15
|
-
descr: ['-h', '--help', 'Prints this message and exit'],
|
|
16
|
-
action: proc do |opts|
|
|
17
|
-
puts opts
|
|
18
|
-
exit
|
|
19
|
-
end
|
|
20
|
-
}
|
|
21
|
-
}.freeze
|
|
9
|
+
include Opts
|
|
22
10
|
|
|
23
11
|
def initialize(container)
|
|
24
12
|
@container = container
|
|
25
|
-
@argv = container.argv
|
|
26
|
-
@file_name = container.file_name
|
|
27
|
-
@options = container.options
|
|
28
|
-
@errors = container.errors
|
|
29
13
|
end
|
|
30
14
|
|
|
31
15
|
def execute
|
|
32
|
-
create_opts
|
|
16
|
+
@opts = Opts.create_opts
|
|
33
17
|
handle_opts
|
|
34
18
|
handle_args
|
|
35
19
|
self
|
|
@@ -39,26 +23,14 @@ class InputParser
|
|
|
39
23
|
|
|
40
24
|
attr_accessor :opts
|
|
41
25
|
|
|
42
|
-
def create_opts
|
|
43
|
-
@opts = OptionParser.new do |opts|
|
|
44
|
-
opts.banner = "Usage: #{File.basename($PROGRAM_NAME)} FILENAME"
|
|
45
|
-
opts.on(*OPTS[:version][:descr]) do
|
|
46
|
-
OPTS[:version][:action].call
|
|
47
|
-
end
|
|
48
|
-
opts.on(*OPTS[:help][:descr]) do
|
|
49
|
-
OPTS[:help][:action].call(opts)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
26
|
def handle_opts
|
|
55
27
|
@opts.parse!(into: @container.options)
|
|
56
|
-
rescue OptionParser::InvalidOption =>
|
|
57
|
-
@container.
|
|
28
|
+
rescue OptionParser::InvalidOption => error
|
|
29
|
+
@container.add_error << error
|
|
58
30
|
end
|
|
59
31
|
|
|
60
32
|
def handle_args
|
|
61
33
|
@container.file_name = ARGV.select { |str| str =~ /.\.log|.\.txt/ }[0] || ''
|
|
62
|
-
@container.
|
|
34
|
+
@container.add_error 'No file_name provided' if @container.file_name.empty?
|
|
63
35
|
end
|
|
64
36
|
end
|
data/lib/rslog/opts.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Service module to give opts
|
|
4
|
+
#
|
|
5
|
+
module Opts
|
|
6
|
+
VERSION = {
|
|
7
|
+
descr: ['-v', '--version', 'Show version and exit'],
|
|
8
|
+
action: proc do
|
|
9
|
+
puts "#{File.basename($PROGRAM_NAME)}: #{RSlog::VERSION}"
|
|
10
|
+
exit
|
|
11
|
+
end
|
|
12
|
+
}.freeze
|
|
13
|
+
|
|
14
|
+
HELP = {
|
|
15
|
+
descr: ['-h', '--help', 'Prints this message and exit'],
|
|
16
|
+
action: proc do |opts|
|
|
17
|
+
puts opts
|
|
18
|
+
exit
|
|
19
|
+
end
|
|
20
|
+
}.freeze
|
|
21
|
+
|
|
22
|
+
def self.create_opts
|
|
23
|
+
OptionParser.new do |opts|
|
|
24
|
+
opts.banner = "Usage: #{File.basename($PROGRAM_NAME)} FILENAME"
|
|
25
|
+
opts.on(*Opts::VERSION[:descr]) { Opts::VERSION[:action].call }
|
|
26
|
+
opts.on(*Opts::HELP[:descr]) { Opts::HELP[:action].call(opts) }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
data/lib/rslog/presenter.rb
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
require_relative 'tools/hash'
|
|
4
4
|
require_relative 'tools/array'
|
|
5
5
|
|
|
6
|
+
# Class to present result in needed format
|
|
7
|
+
#
|
|
6
8
|
class Presenter
|
|
7
9
|
DECORATORS = {
|
|
8
10
|
all: {
|
|
@@ -21,21 +23,33 @@ class Presenter
|
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
def execute(type, formatter)
|
|
24
|
-
@
|
|
26
|
+
@type = type
|
|
27
|
+
@container.messages << send("format_as_#{formatter}")
|
|
25
28
|
self
|
|
26
29
|
end
|
|
27
30
|
|
|
28
31
|
private
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
attr_reader :title, :suffix
|
|
34
|
+
|
|
35
|
+
def title
|
|
36
|
+
decorator[:title]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def suffix
|
|
40
|
+
decorator[:suffix]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def decorator
|
|
44
|
+
DECORATORS[@type]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def format_as_text
|
|
48
|
+
[
|
|
49
|
+
title,
|
|
50
|
+
@container.result.to_multiline_string(suffix),
|
|
51
|
+
separator
|
|
52
|
+
].join("\n")
|
|
39
53
|
end
|
|
40
54
|
|
|
41
55
|
def separator
|
data/lib/rslog/tools/array.rb
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# Monkey patch for Array class
|
|
4
|
+
#
|
|
3
5
|
class Array
|
|
4
6
|
def group_by_index(index = 0)
|
|
5
7
|
group_by { |str| str.split(' ')[index] }
|
|
6
8
|
end
|
|
7
9
|
|
|
8
10
|
def to_multiline_string(suffix = '')
|
|
9
|
-
|
|
10
|
-
each do |item|
|
|
11
|
-
arr << "#{item} #{suffix}"
|
|
12
|
-
end
|
|
13
|
-
arr.join("\n")
|
|
11
|
+
self.map {|item| "#{item} #{suffix}"}.join("\n")
|
|
14
12
|
end
|
|
15
13
|
end
|
data/lib/rslog/tools/hash.rb
CHANGED
|
@@ -2,12 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
require 'set'
|
|
4
4
|
|
|
5
|
+
# Monkey patch for a Hash class to make counts
|
|
6
|
+
#
|
|
5
7
|
class Hash
|
|
6
|
-
def
|
|
8
|
+
def count_by_groups_all
|
|
7
9
|
res = {}
|
|
8
10
|
each do |group_key, arr|
|
|
9
|
-
res[group_key] = arr.size
|
|
10
|
-
|
|
11
|
+
res[group_key] = arr.size
|
|
12
|
+
end
|
|
13
|
+
res
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def count_by_groups_uniq
|
|
17
|
+
res = {}
|
|
18
|
+
each do |group_key, arr|
|
|
19
|
+
res[group_key] = Set.new(arr).size
|
|
11
20
|
end
|
|
12
21
|
res
|
|
13
22
|
end
|
data/lib/rslog/validator.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rslog
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrey Eremeev
|
|
@@ -23,6 +23,7 @@ files:
|
|
|
23
23
|
- lib/rslog/data_parser.rb
|
|
24
24
|
- lib/rslog/extractor.rb
|
|
25
25
|
- lib/rslog/input_parser.rb
|
|
26
|
+
- lib/rslog/opts.rb
|
|
26
27
|
- lib/rslog/presenter.rb
|
|
27
28
|
- lib/rslog/tools/array.rb
|
|
28
29
|
- lib/rslog/tools/hash.rb
|