range_logger 1.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cbc1ba25c348f23176b2541683229adc37ed7bb57f8b627a952c27586572d97b
4
+ data.tar.gz: 31d55198c43598889bbb7684563ceef9005f4cc06861bdde03ad062d8e478a9e
5
+ SHA512:
6
+ metadata.gz: 69480d5774875fb1849d0edaa05bc15e61b888ebfb3e8fc048ca4b973b83b7b3e05aaec491fc9c71fe2d840962717c2d9774aac47f13623bde165f82d017012f
7
+ data.tar.gz: 51d239b0cf1d95d0ddfd4d2299004925a1bba810d81f3247e58ebc750c0dbacc330e62fd58bb02c5a121963158e494dba6090be0956eb0a97598f893b0fa36e3
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in range_logger.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,43 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ range_logger (1.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ chronic (0.10.2)
10
+ coderay (1.1.3)
11
+ diff-lcs (1.4.4)
12
+ method_source (1.0.0)
13
+ pry (0.14.1)
14
+ coderay (~> 1.1)
15
+ method_source (~> 1.0)
16
+ rake (10.5.0)
17
+ rspec (3.10.0)
18
+ rspec-core (~> 3.10.0)
19
+ rspec-expectations (~> 3.10.0)
20
+ rspec-mocks (~> 3.10.0)
21
+ rspec-core (3.10.1)
22
+ rspec-support (~> 3.10.0)
23
+ rspec-expectations (3.10.1)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.10.0)
26
+ rspec-mocks (3.10.2)
27
+ diff-lcs (>= 1.2.0, < 2.0)
28
+ rspec-support (~> 3.10.0)
29
+ rspec-support (3.10.2)
30
+
31
+ PLATFORMS
32
+ x86_64-linux
33
+
34
+ DEPENDENCIES
35
+ bundler (~> 2.2)
36
+ chronic
37
+ pry
38
+ rake (~> 10.0)
39
+ range_logger!
40
+ rspec (~> 3.0)
41
+
42
+ BUNDLED WITH
43
+ 2.2.30
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/range_logger ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ require "range_logger"
3
+ require 'optparse'
4
+ require 'optparse/date'
5
+ require 'chronic'
6
+
7
+ options = {}
8
+
9
+ OptionParser.new do |parser|
10
+ parser.on('-f', '--from [String]', String) do |time|
11
+ options[:from] = Chronic.parse(time)
12
+ end
13
+
14
+ parser.on('-t', '--to [String]', String) do |time|
15
+ options[:to] = Chronic.parse(time)
16
+ end
17
+
18
+ parser.on_tail("-h", "--help", "Show this message") do
19
+ puts parser
20
+ exit
21
+ end
22
+
23
+ parser.on_tail("-v", "--version", "Show gem version") do
24
+ puts RangeLogger::VERSION
25
+ exit
26
+ end
27
+ end.parse!
28
+
29
+ arguments = ARGV
30
+ file_name = arguments[0]
31
+
32
+ if File.exist?(file_name)
33
+ options[:file] = file_name
34
+
35
+ RangeLogger::LogsParser.new(options).run!
36
+ else
37
+ puts "File #{file_name} does not exist"
38
+ end
39
+
@@ -0,0 +1,3 @@
1
+ module RangeLogger
2
+ VERSION = '1.1.0'
3
+ end
@@ -0,0 +1,50 @@
1
+ require 'time'
2
+
3
+ module RangeLogger
4
+ class LogsParser
5
+ attr_reader :from, :to, :file
6
+
7
+ TIME_REGEXP = /\[\d{4}\-\d{2}\-\w{3}\d{2}:\d{2}:\d{2}\.\d{6}\s#\d+\]/
8
+
9
+ def initialize(options={})
10
+ @file = File.open(options[:file])
11
+ @from = options[:from]
12
+ @to = options[:to] || Time.now
13
+ end
14
+
15
+ def run!
16
+ puts "Start date should be before end date" and return if from > to
17
+
18
+ logs = matched_logs
19
+
20
+ if logs.any?
21
+ file_name = "#{format_date(from)}_#{format_date(to)}.log"
22
+ File.write(file_name, logs.join)
23
+ file_size = "#{(File.size(file_name)/(1024.0 * 1024.0)).round(3)} MB"
24
+
25
+ puts "New log file #{file_name} with size #{file_size} has been successfully created"
26
+ else
27
+ puts "There are no mathes, try another date range"
28
+ end
29
+ end
30
+
31
+ def matched_logs
32
+ [].tap do |logs|
33
+ file.each_line do |line|
34
+ next unless timestamp = line.match(TIME_REGEXP)
35
+
36
+ current_time = Time.parse(timestamp[0])
37
+ if current_time <= to
38
+ logs << line if current_time >= from
39
+ else
40
+ break
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ def format_date(date)
47
+ date.strftime("%Y_%m_%d_%H-%M-%S")
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,5 @@
1
+ I, [2021-10-26T16:41:56.979971 #218269] INFO -- : [] Line1
2
+ I, [2021-10-26T17:41:56.979971 #218269] INFO -- : [] Line2
3
+ I, [2021-10-27T18:41:56.979971 #218269] INFO -- : [] Line3
4
+ I, [2021-10-28T20:41:56.979971 #218269] INFO -- : [] Line4
5
+ I, [2021-10-28T21:41:56.979971 #218269] INFO -- : [] Line5
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'date'
3
+
4
+ RSpec.describe RangeLogger do
5
+ let(:parser) { RangeLogger::LogsParser.new({file: File.open('spec/files/test.log'), from: Time.new(2021,10,26,17,30,0), to: Time.new(2021,10,28,20,12,30)}) }
6
+
7
+ describe 'version number' do
8
+ it "returns correct version number" do
9
+ expect(RangeLogger::VERSION).to eq('1.1.0')
10
+ end
11
+ end
12
+
13
+ describe 'format_date' do
14
+ it "returns formatted date" do
15
+ expect(parser.format_date(DateTime.new(2021,11,26,17,30,15))).to eq("2021_11_26_17-30-15")
16
+ end
17
+ end
18
+
19
+ describe 'matched_logs' do
20
+ it "returns matched logs" do
21
+ expect(parser.matched_logs).to eq(["I, [2021-10-26T17:41:56.979971 #218269] INFO -- : [] Line2\n", "I, [2021-10-27T18:41:56.979971 #218269] INFO -- : [] Line3\n"])
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ require "bundler/setup"
2
+ require "range_logger"
3
+
4
+ RSpec.configure do |config|
5
+ # Enable flags like --only-failures and --next-failure
6
+ config.example_status_persistence_file_path = ".rspec_status"
7
+
8
+ # Disable RSpec exposing methods globally on `Module` and `main`
9
+ config.disable_monkey_patching!
10
+
11
+ config.expect_with :rspec do |c|
12
+ c.syntax = :expect
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: range_logger
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Uliana Dzoba
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-11-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: chronic
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Command line tool to download environment logs by date range.
84
+ email:
85
+ - ulianadzoba@gmail.com
86
+ executables:
87
+ - range_logger
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - Gemfile
92
+ - Gemfile.lock
93
+ - Rakefile
94
+ - bin/range_logger
95
+ - lib/range_logger.rb
96
+ - lib/range_logger/version.rb
97
+ - spec/files/test.log
98
+ - spec/range_logger_spec.rb
99
+ - spec/spec_helper.rb
100
+ homepage: https://github.com/ulianadzoba/range_logger
101
+ licenses:
102
+ - MIT
103
+ metadata: {}
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ - bin
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubygems_version: 3.1.4
121
+ signing_key:
122
+ specification_version: 4
123
+ summary: Command line tool to download environment logs by date range.
124
+ test_files: []