logeater 0.4.0 → 0.5.0.pre

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 35ee92c429701edcd6d744f7301a94e64431d612
4
- data.tar.gz: 47e6f5817105c8f74c92b901a57c3bea53ca8f5e
3
+ metadata.gz: 4ccc1408222d5eb6f6af30a91d8cb63c51457c6a
4
+ data.tar.gz: 83254c545dba4b4217510653a6e1f54c95ebf8bf
5
5
  SHA512:
6
- metadata.gz: 82025a9438a23b5337df5813c1b3f51a1ea9dcc76734d383f446d1499b44622c28411eab6705349cb77f06281c4eab4bbf0f8dc907e0574c4237a43c335eb204
7
- data.tar.gz: 278d438799e865804d80fe266003b74ed5b2200ea036022cc1711bd1eb829622b824c4b3cca15a06d2d1120651852fe3fecd98351edb3ef6ee34afbcfca9fd5e
6
+ metadata.gz: adc84e2364b1cb49120f206e21e007c6e0595567372c69cae4448a7bcaf360f17f23f0482de706f5f82b42db8d9870188c94a5b94a947ef460cb678342c6a748
7
+ data.tar.gz: 06481c37537675e13b0f17cfd78b0004459a560994f6aed86ef62c0cff592ae7cf94e77de93a521bba6ee02a076bfb1f882ba474d02372ef42c900f897ec8183
@@ -0,0 +1,26 @@
1
+ class CreateEvents < ActiveRecord::Migration
2
+ def up
3
+ create_table :events do |t|
4
+ t.timestamp :emitted_at
5
+ t.timestamp :received_at
6
+ t.integer :priority
7
+ t.integer :syslog_version
8
+ t.string :hostname
9
+ t.string :appname
10
+ t.string :proc_id
11
+ t.string :msg_id
12
+ t.text :structured_data
13
+ t.text :message
14
+ t.text :original
15
+ t.string :ep_app
16
+ end
17
+
18
+ add_index :events, :ep_app
19
+ execute "ALTER TABLE events ALTER COLUMN received_at SET DEFAULT now()"
20
+ end
21
+
22
+ def down
23
+ remove_index :events, :ep_app
24
+ drop_table :events
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ class ChangeUserIdToBeStringInRequests < ActiveRecord::Migration[5.0]
2
+ def up
3
+ execute "alter table requests alter column user_id type varchar"
4
+ end
5
+
6
+ def down
7
+ execute "alter table requests alter column user_id type integer"
8
+ end
9
+ end
data/db/schema.rb CHANGED
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  # This file is auto-generated from the current state of the database. Instead
3
2
  # of editing this file, please use the migrations feature of Active Record to
4
3
  # incrementally modify your database, and then regenerate this schema definition.
@@ -11,11 +10,27 @@
11
10
  #
12
11
  # It's strongly recommended that you check this file into your version control system.
13
12
 
14
- ActiveRecord::Schema.define(version: 20160502131002) do
13
+ ActiveRecord::Schema.define(version: 20180116193728) do
15
14
 
16
15
  # These are extensions that must be enabled in order to support this database
17
16
  enable_extension "plpgsql"
18
17
 
18
+ create_table "events", force: :cascade do |t|
19
+ t.datetime "emitted_at"
20
+ t.datetime "received_at", default: -> { "now()" }
21
+ t.integer "priority"
22
+ t.integer "syslog_version"
23
+ t.string "hostname"
24
+ t.string "appname"
25
+ t.string "proc_id"
26
+ t.string "msg_id"
27
+ t.text "structured_data"
28
+ t.text "message"
29
+ t.text "original"
30
+ t.string "ep_app"
31
+ t.index ["ep_app"], name: "index_events_on_ep_app", using: :btree
32
+ end
33
+
19
34
  create_table "requests", force: :cascade do |t|
20
35
  t.string "app", null: false
21
36
  t.string "logfile", null: false
@@ -34,17 +49,16 @@ ActiveRecord::Schema.define(version: 20160502131002) do
34
49
  t.integer "http_status"
35
50
  t.datetime "created_at"
36
51
  t.datetime "updated_at"
37
- t.integer "user_id"
52
+ t.string "user_id"
38
53
  t.boolean "tester_bar"
54
+ t.index ["app"], name: "index_requests_on_app", using: :btree
55
+ t.index ["completed_at"], name: "index_requests_on_completed_at", using: :btree
56
+ t.index ["controller", "action"], name: "index_requests_on_controller_and_action", using: :btree
57
+ t.index ["http_status"], name: "index_requests_on_http_status", using: :btree
58
+ t.index ["logfile"], name: "index_requests_on_logfile", using: :btree
59
+ t.index ["params"], name: "index_requests_on_params", using: :gin
60
+ t.index ["subdomain"], name: "index_requests_on_subdomain", using: :btree
61
+ t.index ["uuid"], name: "index_requests_on_uuid", unique: true, using: :btree
39
62
  end
40
63
 
41
- add_index "requests", ["app"], name: "index_requests_on_app", using: :btree
42
- add_index "requests", ["completed_at"], name: "index_requests_on_completed_at", using: :btree
43
- add_index "requests", ["controller", "action"], name: "index_requests_on_controller_and_action", using: :btree
44
- add_index "requests", ["http_status"], name: "index_requests_on_http_status", using: :btree
45
- add_index "requests", ["logfile"], name: "index_requests_on_logfile", using: :btree
46
- add_index "requests", ["params"], name: "index_requests_on_params", using: :gin
47
- add_index "requests", ["subdomain"], name: "index_requests_on_subdomain", using: :btree
48
- add_index "requests", ["uuid"], name: "index_requests_on_uuid", unique: true, using: :btree
49
-
50
64
  end
data/lib/logeater/cli.rb CHANGED
@@ -13,7 +13,7 @@ module Logeater
13
13
 
14
14
  started_all = Time.now
15
15
  files.each_with_index do |file, i|
16
- reader = Logeater::Reader.new(app, file, progress: true)
16
+ reader = Logeater::Reader.new(app, Logeater::Logfile.new(file), progress: true)
17
17
 
18
18
  started_at = Time.now
19
19
  requests = reader.parse
@@ -63,24 +63,23 @@ module Logeater
63
63
  i + 1,
64
64
  files.length ]
65
65
 
66
- reader = Logeater::Reader.new(app, file, options.slice(:progress, :verbose))
67
-
68
- started_at = Time.now
69
- count = reader.remove_existing_entries!
70
- finished_at = Time.now
66
+ import_file Logeater::Logfile.new(file), app, options
67
+ end
71
68
 
72
- $stderr.puts " \e[34mDeleted \e[1m%d\e[0;34m requests for #{reader.filename} in \e[1m%.2f\e[0;34m seconds\e[0m\n" % [
73
- count,
74
- finished_at - started_at ]
69
+ finished_all = Time.now
70
+ seconds = finished_all - started_all
71
+ minutes = (seconds / 60).to_i
72
+ seconds -= (minutes * 60)
73
+ $stderr.puts "Total time %d minutes, %.2f seconds" % [minutes, seconds]
74
+ end
75
75
 
76
- started_at = Time.now
77
- count = reader.import
78
- finished_at = Time.now
76
+ desc "import_since APP TIMESTAMP", "imports log events since timestamp"
77
+ def import_since(app, timestamp)
78
+ started_all = Time.now
79
+ $stderr.puts " > \e[34mImporting events since \e[1m#{timestamp}\e[0m\n"
79
80
 
80
- $stderr.puts " \e[34mImported \e[1m%d\e[0;34m requests in \e[1m%.2f\e[0;34m seconds\e[0m\n\n" % [
81
- count,
82
- finished_at - started_at ]
83
- end
81
+ events = Logeater::Event.where(app: app).since(timestamp)
82
+ import_file Logeater::Eventfile.new(events), app
84
83
 
85
84
  finished_all = Time.now
86
85
  seconds = finished_all - started_all
@@ -89,5 +88,26 @@ module Logeater
89
88
  $stderr.puts "Total time %d minutes, %.2f seconds" % [minutes, seconds]
90
89
  end
91
90
 
91
+
92
+ def import_file(file, app, options={})
93
+ reader = Logeater::Reader.new(app, file, options.slice(:progress, :verbose))
94
+
95
+ started_at = Time.now
96
+ count = reader.remove_existing_entries!
97
+ finished_at = Time.now
98
+
99
+ $stderr.puts " \e[34mDeleted \e[1m%d\e[0;34m requests for #{reader.filename} in \e[1m%.2f\e[0;34m seconds\e[0m\n" % [
100
+ count,
101
+ finished_at - started_at ]
102
+
103
+ started_at = Time.now
104
+ count = reader.import
105
+ finished_at = Time.now
106
+
107
+ $stderr.puts " \e[34mImported \e[1m%d\e[0;34m requests in \e[1m%.2f\e[0;34m seconds\e[0m\n\n" % [
108
+ count,
109
+ finished_at - started_at ]
110
+ end
111
+
92
112
  end
93
113
  end
@@ -0,0 +1,11 @@
1
+ require "active_record"
2
+
3
+ module Logeater
4
+ class Event < ActiveRecord::Base
5
+ self.table_name = "events"
6
+
7
+ def self.since(timestamp)
8
+ where(arel_table[:received_at].gteq(timestamp))
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module Logeater
2
+ class Eventfile
3
+ attr_reader :events, :filename
4
+ attr_accessor :show_progress
5
+ alias :show_progress? :show_progress
6
+
7
+ def initialize(events)
8
+ @events = events
9
+ @filename = "events_#{events.count}"
10
+ end
11
+
12
+ def each_line
13
+ events.pluck(:original).each do |event|
14
+ yield event
15
+ end
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ module Logeater
2
+ class Logfile
3
+ attr_reader :path, :filename
4
+ attr_accessor :show_progress
5
+ alias :show_progress? :show_progress
6
+
7
+ def initialize(path)
8
+ @path = path
9
+ @filename = File.basename(path)
10
+ end
11
+
12
+ def each_line
13
+ File.open(path) do |file|
14
+ io = File.extname(path) == ".gz" ? Zlib::GzipReader.new(file) : file
15
+ pbar = ProgressBar.create(title: filename, total: file.size, autofinish: false, output: $stderr) if show_progress?
16
+ io.each_line do |line|
17
+ yield line
18
+ pbar.progress = file.pos if show_progress?
19
+ end
20
+ pbar.finish if show_progress?
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -17,7 +17,7 @@ module Logeater
17
17
  REQUEST_LINE_MATCHER = /^
18
18
  \[(?<subdomain>[^\]]+)\]\s
19
19
  \[(?<uuid>[\w\-]{36})\]\s+
20
- (?:\[(?:guest|user\.(?<user_id>\d+)(?<tester_bar>:cph)?)\]\s+)?
20
+ (?:\[(?:guest|user\.(?<user_id>\d+)(?<tester_bar>:cph)?|(?<email>.+@[^\]]+))\]\s+)?
21
21
  (?<message>.*)
22
22
  $/x.freeze
23
23
 
@@ -69,7 +69,7 @@ module Logeater
69
69
  { subdomain: match["subdomain"],
70
70
  uuid: match["uuid"],
71
71
  type: :request_line,
72
- user_id: match["user_id"] && match["user_id"].to_i,
72
+ user_id: user_id_for(match),
73
73
  tester_bar: !!match["tester_bar"],
74
74
  message: message
75
75
  }.merge(
@@ -121,6 +121,12 @@ module Logeater
121
121
  duration: match["duration"].to_i }
122
122
  end
123
123
 
124
+ def user_id_for(match)
125
+ return match["user_id"].to_i if match["user_id"]
126
+ return match["email"] if match["email"]
127
+ nil
128
+ end
129
+
124
130
 
125
131
 
126
132
  def log(statement)
@@ -5,14 +5,13 @@ require "oj"
5
5
 
6
6
  module Logeater
7
7
  class Reader
8
- attr_reader :app, :path, :filename, :batch_size
8
+ attr_reader :app, :file, :batch_size
9
9
 
10
- def initialize(app, path, options={})
10
+ def initialize(app, file, options={})
11
11
  @app = app
12
- @path = path
13
- @filename = File.basename(path)
12
+ @file = file
13
+ @file.show_progress = options.fetch :progress, false
14
14
  @parser = Logeater::Parser.new
15
- @show_progress = options.fetch :progress, false
16
15
  @batch_size = options.fetch :batch_size, 500
17
16
  @verbose = options.fetch :verbose, false
18
17
  @count = 0
@@ -54,33 +53,16 @@ module Logeater
54
53
  end
55
54
 
56
55
  def remove_existing_entries!
57
- Logeater::Request.where(app: app, logfile: filename).delete_all
58
- end
59
-
60
- def show_progress?
61
- @show_progress
56
+ Logeater::Request.where(app: app, logfile: file.filename).delete_all
62
57
  end
63
58
 
64
59
  def verbose?
65
60
  @verbose
66
61
  end
67
62
 
68
- def each_line
69
- File.open(path) do |file|
70
- io = File.extname(path) == ".gz" ? Zlib::GzipReader.new(file) : file
71
- pbar = ProgressBar.create(title: filename, total: file.size, autofinish: false, output: $stderr) if show_progress?
72
- io.each_line do |line|
73
- yield line
74
- pbar.progress = file.pos if show_progress?
75
- end
76
- pbar.finish if show_progress?
77
- end
78
- end
79
- alias :scan :each_line
80
-
81
63
  def each_request
82
64
  count = 0
83
- each_line do |line|
65
+ file.each_line do |line|
84
66
  process_line! line do |request|
85
67
  yield request
86
68
  count += 1
@@ -102,7 +84,7 @@ module Logeater
102
84
  if attributes[:type] == :request_started
103
85
  requests[attributes[:uuid]] = attributes
104
86
  .slice(:uuid, :subdomain, :http_method, :path, :remote_ip, :user_id, :tester_bar)
105
- .merge(started_at: attributes[:timestamp], logfile: filename, app: app)
87
+ .merge(started_at: attributes[:timestamp], logfile: file.filename, app: app)
106
88
  return
107
89
  end
108
90
 
@@ -6,14 +6,9 @@ module Logeater
6
6
  self.table_name = "requests"
7
7
 
8
8
  def self.import(values)
9
- # values have to be unique by uuid
10
- values = values.uniq { |request| request.uuid }
11
-
12
- super values
13
- rescue PG::UniqueViolation, ActiveRecord::RecordNotUnique
14
- # try again after skipping requests with existing uuids
9
+ # values have to be unique by uuid so we pull already saved ones out before trying to insert
15
10
  existing_uuids = where(uuid: values.map(&:uuid)).pluck(:uuid)
16
- values = values.reject { |request| existing_uuids.member?(request.uuid) }
11
+ values = values.uniq(&:uuid).reject { |request| existing_uuids.member?(request.uuid) }
17
12
 
18
13
  super values
19
14
  end
@@ -1,3 +1,3 @@
1
1
  module Logeater
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0.pre"
3
3
  end
data/lib/logeater.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require "logeater/parser"
2
2
  require "logeater/reader"
3
3
  require "logeater/request"
4
+ require "logeater/event"
5
+ require "logeater/logfile"
6
+ require "logeater/eventfile"
4
7
  require "logeater/version"
5
8
  require "yaml"
6
9
  require "erb"
data/logeater.gemspec CHANGED
@@ -20,15 +20,13 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency "activerecord", ">= 4.2.7", "< 5.1.0"
22
22
  spec.add_dependency "activesupport", ">= 4.2.7", "< 5.1.0"
23
- # spec.add_dependency "activerecord", "~> 5.0.0"
24
- # spec.add_dependency "activesupport", "~> 5.0.0"
25
- spec.add_dependency "pg", "~> 0.18.3"
23
+ spec.add_dependency "pg", ">= 0.18.0", "< 1.0"
26
24
  spec.add_dependency "standalone_migrations", "~> 5.0.0"
27
25
  spec.add_dependency "addressable"
28
26
  spec.add_dependency "ruby-progressbar"
29
27
  spec.add_dependency "activerecord-import", "~> 0.10"
30
28
  spec.add_dependency "thor", "~> 0.19.1"
31
- spec.add_dependency "oj", "~> 2.15"
29
+ spec.add_dependency "oj", ">= 2.15"
32
30
 
33
31
  spec.add_development_dependency "bundler", "~> 1.7"
34
32
  spec.add_development_dependency "rake", "~> 10.0"
@@ -1,7 +1,7 @@
1
1
  require "test_helper"
2
2
 
3
3
  class LogeaterTest < ActiveSupport::TestCase
4
- attr_reader :logfile
4
+ attr_reader :logfile, :events
5
5
 
6
6
 
7
7
  context "Given the log of a single request, it" do
@@ -10,17 +10,17 @@ class LogeaterTest < ActiveSupport::TestCase
10
10
  end
11
11
 
12
12
  should "identify the name of the logfile" do
13
- assert_equal "single_request.log", reader.filename
13
+ assert_equal "single_request.log", logfile_reader.file.filename
14
14
  end
15
15
 
16
16
  should "create an entry in the database" do
17
17
  assert_difference "Logeater::Request.count", +1 do
18
- reader.import
18
+ logfile_reader.import
19
19
  end
20
20
  end
21
21
 
22
22
  should "set all the attributes" do
23
- reader.import
23
+ logfile_reader.import
24
24
  request = Logeater::Request.first
25
25
 
26
26
  params = {"refresh_page" => "true", "id" => "1035826228"}
@@ -47,7 +47,7 @@ class LogeaterTest < ActiveSupport::TestCase
47
47
  Logeater::Request.create!(app: app, logfile: "single_request.log", uuid: "3")
48
48
 
49
49
  assert_difference "Logeater::Request.count", -2 do
50
- reader.reimport
50
+ logfile_reader.reimport
51
51
  end
52
52
  end
53
53
  end
@@ -60,7 +60,62 @@ class LogeaterTest < ActiveSupport::TestCase
60
60
 
61
61
  should "create an entry in the database" do
62
62
  assert_difference "Logeater::Request.count", +1 do
63
- reader.import
63
+ logfile_reader.import
64
+ end
65
+ end
66
+ end
67
+
68
+
69
+ context "Given an app and a timestamp, import_since" do
70
+ setup do
71
+ log_sample = File.open(File.expand_path("./test/data/single_request.log"))
72
+ log_sample.lines do |line|
73
+ Logeater::Event.create(ep_app: app, original: line)
74
+ end
75
+ @events = Logeater::Event.all
76
+ end
77
+
78
+ should "import events since that given timestamp" do
79
+ assert_difference "Logeater::Request.count", +1 do
80
+ eventfile_reader.import
81
+ end
82
+ end
83
+
84
+ should "not reimport events if given twice" do
85
+ assert_difference "Logeater::Request.count", +1 do
86
+ eventfile_reader.import
87
+ end
88
+
89
+ assert_no_difference "Logeater::Request.count" do
90
+ eventfile_reader.import
91
+ end
92
+ end
93
+ end
94
+
95
+ context "Given a partial request in one import and the rest in a subsiquent import, it" do
96
+ setup do
97
+ @lines = File.open(File.expand_path("./test/data/single_request.log")).lines.to_a
98
+ end
99
+
100
+ should "save the request after having the full request" do
101
+ # The first two lines will not be enough to describe a complete request
102
+ # so Logeater will not be able to create a request from them...
103
+ @lines[0...2].each do |line|
104
+ Logeater::Event.create(ep_app: app, original: line)
105
+ end
106
+ @events = Logeater::Event.all
107
+ assert_no_difference "Logeater::Request.count" do
108
+ eventfile_reader.import
109
+ end
110
+
111
+ # ...but if we later discover the rest of the lines that describe a complete
112
+ # request, it'd be good if Logeater could then recognize and import it.
113
+ @lines[2..-1].each do |line|
114
+ Logeater::Event.create(ep_app: app, original: line)
115
+ end
116
+ @events = Logeater::Event.all
117
+ assert_difference "Logeater::Request.count", +1 do
118
+ eventfile_reader.import
64
119
  end
65
120
  end
66
121
  end
@@ -72,8 +127,12 @@ private
72
127
  "test"
73
128
  end
74
129
 
75
- def reader
76
- Logeater::Reader.new(app, logfile)
130
+ def logfile_reader
131
+ Logeater::Reader.new(app, Logeater::Logfile.new(logfile))
132
+ end
133
+
134
+ def eventfile_reader
135
+ Logeater::Reader.new(app, Logeater::Eventfile.new(events))
77
136
  end
78
137
 
79
138
  end
@@ -104,11 +104,29 @@ class ParserTest < ActiveSupport::TestCase
104
104
  end
105
105
  end
106
106
 
107
+ context "that indicates the current user via email, it" do
108
+ setup do
109
+ @line = "I, [2015-01-10T15:18:05.850839 #18070] INFO -- : [livingsaviorco] [2d89d962-57c4-47c9-a9e9-6a16a5f22a12] [example@user.com] [gzip] Compress reponse by 42.2 KB (83.3%) (1.4ms)"
110
+ end
111
+
112
+ should "identify the user's email" do
113
+ assert_parses user_id: "example@user.com"
114
+ end
115
+
116
+ should "identify the remainder of the log message" do
117
+ assert_parses message: "[gzip] Compress reponse by 42.2 KB (83.3%) (1.4ms)"
118
+ end
119
+ end
120
+
107
121
  context "that indicates that the user is logged out, it" do
108
122
  setup do
109
123
  @line = "I, [2015-01-10T15:18:05.850839 #18070] INFO -- : [livingsaviorco] [2d89d962-57c4-47c9-a9e9-6a16a5f22a12] [guest] [gzip] Compress reponse by 42.2 KB (83.3%) (1.4ms)"
110
124
  end
111
125
 
126
+ should "identify the user as a guest" do
127
+ assert_parses user_id: nil
128
+ end
129
+
112
130
  should "identify the remainder of the log message" do
113
131
  assert_parses message: "[gzip] Compress reponse by 42.2 KB (83.3%) (1.4ms)"
114
132
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logeater
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Lail
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-15 00:00:00.000000000 Z
11
+ date: 2018-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -54,16 +54,22 @@ dependencies:
54
54
  name: pg
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - "~>"
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 0.18.0
60
+ - - "<"
58
61
  - !ruby/object:Gem::Version
59
- version: 0.18.3
62
+ version: '1.0'
60
63
  type: :runtime
61
64
  prerelease: false
62
65
  version_requirements: !ruby/object:Gem::Requirement
63
66
  requirements:
64
- - - "~>"
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.18.0
70
+ - - "<"
65
71
  - !ruby/object:Gem::Version
66
- version: 0.18.3
72
+ version: '1.0'
67
73
  - !ruby/object:Gem::Dependency
68
74
  name: standalone_migrations
69
75
  requirement: !ruby/object:Gem::Requirement
@@ -138,14 +144,14 @@ dependencies:
138
144
  name: oj
139
145
  requirement: !ruby/object:Gem::Requirement
140
146
  requirements:
141
- - - "~>"
147
+ - - ">="
142
148
  - !ruby/object:Gem::Version
143
149
  version: '2.15'
144
150
  type: :runtime
145
151
  prerelease: false
146
152
  version_requirements: !ruby/object:Gem::Requirement
147
153
  requirements:
148
- - - "~>"
154
+ - - ">="
149
155
  - !ruby/object:Gem::Version
150
156
  version: '2.15'
151
157
  - !ruby/object:Gem::Dependency
@@ -269,9 +275,14 @@ files:
269
275
  - db/migrate/20150602022241_add_user_id_and_tester_bar_to_requests.rb
270
276
  - db/migrate/20160218230227_add_indexes.rb
271
277
  - db/migrate/20160502131002_drop_http_response.rb
278
+ - db/migrate/20171109171953_create_events.rb
279
+ - db/migrate/20180116193728_change_user_id_to_be_string_in_requests.rb
272
280
  - db/schema.rb
273
281
  - lib/logeater.rb
274
282
  - lib/logeater/cli.rb
283
+ - lib/logeater/event.rb
284
+ - lib/logeater/eventfile.rb
285
+ - lib/logeater/logfile.rb
275
286
  - lib/logeater/params_parser.rb
276
287
  - lib/logeater/parser.rb
277
288
  - lib/logeater/parser_errors.rb
@@ -300,12 +311,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
300
311
  version: '0'
301
312
  required_rubygems_version: !ruby/object:Gem::Requirement
302
313
  requirements:
303
- - - ">="
314
+ - - ">"
304
315
  - !ruby/object:Gem::Version
305
- version: '0'
316
+ version: 1.3.1
306
317
  requirements: []
307
318
  rubyforge_project:
308
- rubygems_version: 2.5.1
319
+ rubygems_version: 2.6.11
309
320
  signing_key:
310
321
  specification_version: 4
311
322
  summary: Parses log files and imports them into a database