peak_flow_utils 0.1.11 → 0.1.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/peak_flow_utils/application_controller.rb +6 -1
  3. data/app/controllers/peak_flow_utils/pings/postgres_connections_controller.rb +10 -0
  4. data/app/controllers/peak_flow_utils/pings/sidekiq_controller.rb +13 -0
  5. data/app/services/peak_flow_utils/database_initializer_service.rb +3 -3
  6. data/app/services/peak_flow_utils/deep_merger.rb +45 -0
  7. data/app/services/peak_flow_utils/handlers_finder_service.rb +2 -2
  8. data/app/services/peak_flow_utils/translations_parser_service.rb +3 -3
  9. data/config/routes.rb +4 -0
  10. data/lib/peak_flow_utils/migrations/{20150907090900_create_handlers.rb → 20150907070908_create_handlers.rb} +0 -0
  11. data/{app/models/peak_flow_utils → lib/peak_flow_utils/models}/application_record.rb +0 -0
  12. data/{app/models/peak_flow_utils → lib/peak_flow_utils/models}/group.rb +0 -0
  13. data/{app/models/peak_flow_utils → lib/peak_flow_utils/models}/handler.rb +0 -0
  14. data/{app/models/peak_flow_utils → lib/peak_flow_utils/models}/handler_text.rb +0 -0
  15. data/{app/models/peak_flow_utils → lib/peak_flow_utils/models}/scanned_file.rb +0 -0
  16. data/{app/models/peak_flow_utils → lib/peak_flow_utils/models}/translation_key.rb +0 -0
  17. data/{app/models/peak_flow_utils → lib/peak_flow_utils/models}/translation_value.rb +0 -0
  18. data/lib/peak_flow_utils/notifier.rb +62 -5
  19. data/lib/peak_flow_utils/notifier_rack.rb +6 -6
  20. data/lib/peak_flow_utils/notifier_response.rb +6 -2
  21. data/lib/peak_flow_utils/version.rb +1 -1
  22. data/lib/peak_flow_utils.rb +10 -2
  23. metadata +17 -25
  24. data/app/assets/config/peak_flow_utils_manifest.js +0 -2
  25. data/app/assets/javascripts/peak_flow_utils/application.js +0 -14
  26. data/app/assets/stylesheets/peak_flow_utils/application.css +0 -15
  27. data/app/controllers/peak_flow_utils/pings/sidekiq_pings_controller.rb +0 -10
  28. data/app/helpers/peak_flow_utils/application_helper.rb +0 -2
  29. data/app/jobs/peak_flow_utils/application_job.rb +0 -2
  30. data/app/mailers/peak_flow_utils/application_mailer.rb +0 -4
  31. data/app/views/layouts/peak_flow_utils/application.html.erb +0 -14
  32. data/bin/peak_flow_rspec_files +0 -21
  33. data/lib/peak_flow_utils/rspec_helper.rb +0 -195
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1bdc19548c94f5a84768b360d892e622d4a43e2b93aabd2211ff01aaa90aee1f
4
- data.tar.gz: 9144161819e38594b3b8adefd74d9f60c7b9de2c1e5873c5f007058d4ea74eb5
3
+ metadata.gz: b4fb7a276f751a58ba19b74e73955323e0f1b89215312b50ee3e3b9cf89a85f4
4
+ data.tar.gz: 29edd9b2f4225cf2ea74c67d4fccd1b21a0149781f2cacc168309ef8dd3082c6
5
5
  SHA512:
6
- metadata.gz: bb753bd4bda442fae033de2b2d1f05a3815f0584ca54a263ffc2d8e2647692cb3af6f40289c7989301087ff0d44cf727681e4a370dc50fba14bd504a71457f57
7
- data.tar.gz: 0b8b67efb910799b5a78dda78c12f2e85ac4e45144493d662babafa03dc328f40f2bf4814030fab49072716b5285976c965460e13fc25f9c8965217933b452a2
6
+ metadata.gz: 18328934879ae9fbb148e812926d68b5dca82837f929e5c3f3228bc4bc34bb140e8d42013333ef68976931819960d45110b26a8bf8bb2b37e363b8a519bf0ee9
7
+ data.tar.gz: 4251f1f1213fc0e9dfa426c7c4a1e75c53dbd23dff37ce09213f857ff7b7fba56251875d17a7baed74273d744f29b03bd9fa3e41f7a877319ada3cf9760bf9b4
@@ -7,7 +7,12 @@ private
7
7
 
8
8
  def authenticate
9
9
  authenticate_or_request_with_http_basic do |username, password|
10
- username == ENV.fetch("PEAK_FLOW_PINGS_USERNAME") && password == ENV.fetch("PEAK_FLOW_PINGS_PASSWORD")
10
+ if ENV["PEAKFLOW_PINGS_USERNAME"].blank? || ENV["PEAKFLOW_PINGS_PASSWORD"].blank?
11
+ Rails.logger.error "Peakflow utils: Pings called but PEAKFLOW_PINGS_USERNAME or PEAKFLOW_PINGS_PASSWORD wasn't set"
12
+ false
13
+ end
14
+
15
+ username == ENV.fetch("PEAKFLOW_PINGS_USERNAME") && password == ENV.fetch("PEAKFLOW_PINGS_PASSWORD")
11
16
  end
12
17
  end
13
18
  end
@@ -0,0 +1,10 @@
1
+ class PeakFlowUtils::Pings::PostgresConnectionsController < PeakFlowUtils::ApplicationController
2
+ def count
3
+ postgres_connections_count = ActiveRecord::Base.connection.execute("SELECT SUM(numbackends) AS connections_count FROM pg_stat_database").to_a.first
4
+
5
+ render json: {
6
+ check_json_status: "OK",
7
+ postgres_connections_count: postgres_connections_count.fetch("connections_count")
8
+ }
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ require "sidekiq/api"
2
+
3
+ class PeakFlowUtils::Pings::SidekiqController < PeakFlowUtils::ApplicationController
4
+ def index
5
+ sidekiq_queue = Sidekiq::Queue.new
6
+
7
+ render json: {
8
+ check_json_status: "OK",
9
+ latency: sidekiq_queue.latency,
10
+ queue_size: sidekiq_queue.size
11
+ }
12
+ end
13
+ end
@@ -1,6 +1,6 @@
1
1
  class PeakFlowUtils::DatabaseInitializerService < PeakFlowUtils::ApplicationService
2
- def execute
3
- path = File.realpath("#{File.dirname(__FILE__)}/../../../lib/peak_flow_utils/migrations")
2
+ def perform
3
+ path = File.realpath("#{__dir__}/../../../lib/peak_flow_utils/migrations")
4
4
  create_schema_table unless schema_table_exists?
5
5
 
6
6
  Dir["#{path}/[0-9]*_*.rb"].sort.map do |filename|
@@ -22,7 +22,7 @@ class PeakFlowUtils::DatabaseInitializerService < PeakFlowUtils::ApplicationServ
22
22
  private
23
23
 
24
24
  def create_schema_table
25
- PeakFlowUtils::ApplicationRecord.connection.execute("CREATE TABLE schema_migrations (version VARCHAT)")
25
+ PeakFlowUtils::ApplicationRecord.connection.execute("CREATE TABLE schema_migrations (version VARCHAR)")
26
26
  end
27
27
 
28
28
  def register_migration_migrated(version)
@@ -0,0 +1,45 @@
1
+ class PeakFlowUtils::DeepMerger < PeakFlowUtils::ApplicationService
2
+ def initialize(hashes:)
3
+ @hashes = hashes
4
+ end
5
+
6
+ def perform
7
+ merged = {}
8
+
9
+ @hashes.each do |hash|
10
+ merge_hash(hash, merged)
11
+ end
12
+
13
+ succeed! merged
14
+ end
15
+
16
+ def merge_something(object, merged)
17
+ if object.is_a?(Array)
18
+ merge_array(object, merged)
19
+ elsif object.is_a?(Hash)
20
+ merge_hash(object, merged)
21
+ else
22
+ raise "Unknown object: #{object.class.name}"
23
+ end
24
+ end
25
+
26
+ def merge_array(array, merged)
27
+ array.each do |value|
28
+ merged << value
29
+ end
30
+ end
31
+
32
+ def merge_hash(hash, merged)
33
+ hash.each do |key, value|
34
+ if !merged.key?(key)
35
+ merged[key] = value
36
+ elsif value.is_a?(Array)
37
+ merge_array(value, merged[key])
38
+ elsif value.is_a?(Hash)
39
+ merge_hash(value, merged[key])
40
+ else
41
+ raise "Unknown object: #{object.class.name}"
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,8 +1,8 @@
1
1
  class PeakFlowUtils::HandlersFinderService < PeakFlowUtils::ApplicationService
2
- def execute
2
+ def perform
3
3
  handlers = []
4
4
 
5
- Dir.foreach("#{File.dirname(__FILE__)}/../../handlers/peak_flow_utils") do |file|
5
+ Dir.foreach("#{__dir__}/../../handlers/peak_flow_utils") do |file|
6
6
  match = file.match(/\A(.+)_handler\.rb\Z/)
7
7
  next unless match
8
8
 
@@ -1,7 +1,7 @@
1
1
  class PeakFlowUtils::TranslationsParserService < PeakFlowUtils::ApplicationService
2
2
  attr_reader :db
3
3
 
4
- def execute
4
+ def perform
5
5
  PeakFlowUtils::DatabaseInitializerService.execute!
6
6
 
7
7
  cache_translations_in_dir(Rails.root.join("config/locales"))
@@ -103,11 +103,11 @@ private
103
103
  puts message.to_s if @debug # rubocop:disable Rails/Output
104
104
  end
105
105
 
106
- def execute_migrations
106
+ def perform_migrations
107
107
  require "baza_migrations"
108
108
 
109
109
  executor = BazaMigrations::MigrationsExecutor.new(db: @db)
110
- executor.add_dir "#{File.dirname(__FILE__)}/../../db/baza_translations_migrations"
110
+ executor.add_dir "#{__dir__}/../../db/baza_translations_migrations"
111
111
  executor.execute_migrations
112
112
  end
113
113
 
data/config/routes.rb CHANGED
@@ -1,2 +1,6 @@
1
1
  PeakFlowUtils::Engine.routes.draw do
2
+ namespace :pings do
3
+ get "postgres_connections", to: "postgres_connections#count"
4
+ get "sidekiq", to: "sidekiq#index"
5
+ end
2
6
  end
@@ -1,4 +1,5 @@
1
1
  class PeakFlowUtils::Notifier
2
+ class FailedToReportError < RuntimeError; end
2
3
  class NotConfiguredError < RuntimeError; end
3
4
 
4
5
  attr_reader :auth_token
@@ -8,13 +9,46 @@ class PeakFlowUtils::Notifier
8
9
  end
9
10
 
10
11
  def self.current
11
- raise PeakFlowUtils::Notifier::NotConfiguredError, "Hasn't been configured" unless @current
12
+ raise PeakFlowUtils::Notifier::NotConfiguredError, "Hasn't been configured" if !@current && Rails.env.test?
12
13
 
13
14
  @current
14
15
  end
15
16
 
16
- def self.notify(*args)
17
- PeakFlowUtils::Notifier.current.notify(*args)
17
+ def self.current_parameters(parameters: nil)
18
+ hashes = PeakFlowUtils::Notifier.current_parameters_hashes
19
+ hashes << parameters if parameters
20
+
21
+ PeakFlowUtils::DeepMerger.execute!(hashes: hashes)
22
+ end
23
+
24
+ def self.current_parameters_hashes
25
+ hashes = []
26
+
27
+ Thread.current[:peakflow_utils] ||= {}
28
+ Thread.current[:peakflow_utils].dig(:notifier, :with_parameters)&.each_value do |more_parameters|
29
+ hashes << more_parameters
30
+ end
31
+
32
+ hashes
33
+ end
34
+
35
+ def self.notify(*args, **opts, &blk)
36
+ PeakFlowUtils::Notifier.current.notify(*args, **opts, &blk)
37
+ end
38
+
39
+ def self.with_parameters(parameters)
40
+ random_id = SecureRandom.hex(16)
41
+
42
+ Thread.current[:peakflow_utils] ||= {}
43
+ Thread.current[:peakflow_utils][:notifier] ||= {}
44
+ Thread.current[:peakflow_utils][:notifier][:with_parameters] ||= {}
45
+ Thread.current[:peakflow_utils][:notifier][:with_parameters][random_id] = parameters
46
+
47
+ begin
48
+ yield
49
+ ensure
50
+ Thread.current[:peakflow_utils][:notifier][:with_parameters].delete(random_id)
51
+ end
18
52
  end
19
53
 
20
54
  def initialize(auth_token:)
@@ -28,6 +62,8 @@ class PeakFlowUtils::Notifier
28
62
  error: error
29
63
  )
30
64
 
65
+ merged_parameters = PeakFlowUtils::Notifier.current_parameters(parameters: parameters)
66
+
31
67
  uri = URI("https://www.peakflow.io/errors/reports")
32
68
 
33
69
  https = Net::HTTP.new(uri.host, uri.port)
@@ -42,7 +78,7 @@ class PeakFlowUtils::Notifier
42
78
  file_path: error_parser.file_path,
43
79
  line_number: error_parser.line_number,
44
80
  message: error.message,
45
- parameters: parameters,
81
+ parameters: merged_parameters,
46
82
  remote_ip: error_parser.remote_ip,
47
83
  url: error_parser.url,
48
84
  user_agent: error_parser.user_agent
@@ -54,8 +90,29 @@ class PeakFlowUtils::Notifier
54
90
  request.body = JSON.generate(data)
55
91
 
56
92
  response = https.request(request)
93
+
94
+ raise FailedToReportError, error_message_from_response(response) unless response.code == "200"
95
+
57
96
  response_data = JSON.parse(response.body)
58
97
 
59
- PeakFlowUtils::NotifierResponse.new(url: response_data["url"]) # URL not always present so dont use fetch
98
+ # Data not always present so dont use fetch
99
+ PeakFlowUtils::NotifierResponse.new(
100
+ bug_report_id: response_data["bug_report_id"],
101
+ bug_report_instance_id: response_data["bug_report_instance_id"],
102
+ project_id: response_data["project_id"],
103
+ project_slug: response_data["project_slug"],
104
+ url: response_data["url"]
105
+ )
106
+ end
107
+
108
+ def error_message_from_response(response)
109
+ message = "Couldn't report error to Peakflow (code #{response.code})"
110
+
111
+ if response["content-type"]&.starts_with?("application/json")
112
+ response_data = JSON.parse(response.body)
113
+ message << ": #{response_data.fetch("errors").join(". ")}" if response_data["errors"]
114
+ end
115
+
116
+ message
60
117
  end
61
118
  end
@@ -9,13 +9,13 @@ class PeakFlowUtils::NotifierRack
9
9
  rescue Exception => e # rubocop:disable Lint/RescueException
10
10
  controller = env["action_controller.instance"]
11
11
  request = controller&.request
12
- parameters = {}.merge(request.GET).merge(request.POST)
13
12
 
14
- PeakFlowUtils::Notifier.notify(
15
- environment: env,
16
- error: e,
17
- parameters: parameters
18
- )
13
+ PeakFlowUtils::Notifier.with_parameters(rack: {get: request.GET, post: request.POST}) do
14
+ PeakFlowUtils::Notifier.notify(
15
+ environment: env,
16
+ error: e
17
+ )
18
+ end
19
19
 
20
20
  raise e
21
21
  end
@@ -1,7 +1,11 @@
1
1
  class PeakFlowUtils::NotifierResponse
2
- attr_reader :url
2
+ attr_reader :bug_report_id, :bug_report_instance_id, :project_id, :project_slug, :url
3
3
 
4
- def initialize(url:)
4
+ def initialize(bug_report_id:, bug_report_instance_id:, project_id:, project_slug:, url:)
5
+ @bug_report_id = bug_report_id
6
+ @bug_report_instance_id = bug_report_instance_id
7
+ @project_id = project_id
8
+ @project_slug = project_slug
5
9
  @url = url
6
10
  end
7
11
  end
@@ -1,3 +1,3 @@
1
1
  module PeakFlowUtils
2
- VERSION = "0.1.11".freeze
2
+ VERSION = "0.1.15".freeze
3
3
  end
@@ -4,7 +4,8 @@ require "array_enumerator"
4
4
  require "service_pattern"
5
5
 
6
6
  module PeakFlowUtils
7
- path = "#{File.dirname(__FILE__)}/peak_flow_utils"
7
+ path = "#{__dir__}/peak_flow_utils"
8
+ models_path = "#{__dir__}/peak_flow_utils/models"
8
9
 
9
10
  autoload :Notifier, "#{path}/notifier"
10
11
  autoload :NotifierErrorParser, "#{path}/notifier_error_parser"
@@ -12,6 +13,13 @@ module PeakFlowUtils
12
13
  autoload :NotifierRails, "#{path}/notifier_rails"
13
14
  autoload :NotifierResponse, "#{path}/notifier_response"
14
15
  autoload :NotifierSidekiq, "#{path}/notifier_sidekiq"
15
- autoload :RspecHelper, "#{path}/rspec_helper"
16
16
  autoload :HandlerHelper, "#{path}/handler_helper"
17
+
18
+ autoload :ApplicationRecord, "#{models_path}/application_record"
19
+ autoload :Group, "#{models_path}/group"
20
+ autoload :HandlerText, "#{models_path}/handler_text"
21
+ autoload :Handler, "#{models_path}/handler"
22
+ autoload :ScannedFile, "#{models_path}/scanned_file"
23
+ autoload :TranslationKey, "#{models_path}/translation_key"
24
+ autoload :TranslationValue, "#{models_path}/translation_value"
17
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: peak_flow_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - kaspernj
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-23 00:00:00.000000000 Z
11
+ date: 2022-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 1.0.5
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 1.0.5
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: redis
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -111,19 +111,16 @@ dependencies:
111
111
  description: Utilities to be used with PeakFlow.
112
112
  email:
113
113
  - kaspernj@gmail.com
114
- executables:
115
- - peak_flow_rspec_files
114
+ executables: []
116
115
  extensions: []
117
116
  extra_rdoc_files: []
118
117
  files:
119
118
  - MIT-LICENSE
120
119
  - README.md
121
120
  - Rakefile
122
- - app/assets/config/peak_flow_utils_manifest.js
123
- - app/assets/javascripts/peak_flow_utils/application.js
124
- - app/assets/stylesheets/peak_flow_utils/application.css
125
121
  - app/controllers/peak_flow_utils/application_controller.rb
126
- - app/controllers/peak_flow_utils/pings/sidekiq_pings_controller.rb
122
+ - app/controllers/peak_flow_utils/pings/postgres_connections_controller.rb
123
+ - app/controllers/peak_flow_utils/pings/sidekiq_controller.rb
127
124
  - app/handlers/peak_flow_utils/application_handler.rb
128
125
  - app/handlers/peak_flow_utils/devise_handler.rb
129
126
  - app/handlers/peak_flow_utils/file_handler.rb
@@ -132,21 +129,12 @@ files:
132
129
  - app/handlers/peak_flow_utils/simple_form_handler.rb
133
130
  - app/handlers/peak_flow_utils/validations_handler.rb
134
131
  - app/handlers/peak_flow_utils/will_paginate_handler.rb
135
- - app/helpers/peak_flow_utils/application_helper.rb
136
- - app/jobs/peak_flow_utils/application_job.rb
137
- - app/mailers/peak_flow_utils/application_mailer.rb
138
- - app/models/peak_flow_utils/application_record.rb
139
- - app/models/peak_flow_utils/group.rb
140
- - app/models/peak_flow_utils/handler.rb
141
- - app/models/peak_flow_utils/handler_text.rb
142
- - app/models/peak_flow_utils/scanned_file.rb
143
- - app/models/peak_flow_utils/translation_key.rb
144
- - app/models/peak_flow_utils/translation_value.rb
145
132
  - app/services/peak_flow_utils/application_migration.rb
146
133
  - app/services/peak_flow_utils/application_service.rb
147
134
  - app/services/peak_flow_utils/attribute_service.rb
148
135
  - app/services/peak_flow_utils/configuration_service.rb
149
136
  - app/services/peak_flow_utils/database_initializer_service.rb
137
+ - app/services/peak_flow_utils/deep_merger.rb
150
138
  - app/services/peak_flow_utils/erb_inspector.rb
151
139
  - app/services/peak_flow_utils/erb_inspector/file_inspector.rb
152
140
  - app/services/peak_flow_utils/erb_inspector/translation_inspector.rb
@@ -155,25 +143,29 @@ files:
155
143
  - app/services/peak_flow_utils/model_inspector.rb
156
144
  - app/services/peak_flow_utils/translation_service.rb
157
145
  - app/services/peak_flow_utils/translations_parser_service.rb
158
- - app/views/layouts/peak_flow_utils/application.html.erb
159
- - bin/peak_flow_rspec_files
160
146
  - config/routes.rb
161
147
  - lib/peak_flow_utils.rb
162
148
  - lib/peak_flow_utils/engine.rb
163
149
  - lib/peak_flow_utils/handler_helper.rb
164
150
  - lib/peak_flow_utils/migrations/20150902155200_create_translation_keys.rb
151
+ - lib/peak_flow_utils/migrations/20150907070908_create_handlers.rb
165
152
  - lib/peak_flow_utils/migrations/20150907070909_create_groups.rb
166
- - lib/peak_flow_utils/migrations/20150907090900_create_handlers.rb
167
153
  - lib/peak_flow_utils/migrations/20150908085500_create_translation_values.rb
168
154
  - lib/peak_flow_utils/migrations/20150908090800_create_handler_texts.rb
169
155
  - lib/peak_flow_utils/migrations/20160411190500_create_scanned_files.rb
156
+ - lib/peak_flow_utils/models/application_record.rb
157
+ - lib/peak_flow_utils/models/group.rb
158
+ - lib/peak_flow_utils/models/handler.rb
159
+ - lib/peak_flow_utils/models/handler_text.rb
160
+ - lib/peak_flow_utils/models/scanned_file.rb
161
+ - lib/peak_flow_utils/models/translation_key.rb
162
+ - lib/peak_flow_utils/models/translation_value.rb
170
163
  - lib/peak_flow_utils/notifier.rb
171
164
  - lib/peak_flow_utils/notifier_error_parser.rb
172
165
  - lib/peak_flow_utils/notifier_rack.rb
173
166
  - lib/peak_flow_utils/notifier_rails.rb
174
167
  - lib/peak_flow_utils/notifier_response.rb
175
168
  - lib/peak_flow_utils/notifier_sidekiq.rb
176
- - lib/peak_flow_utils/rspec_helper.rb
177
169
  - lib/peak_flow_utils/version.rb
178
170
  - lib/tasks/peak_flow_utils_tasks.rake
179
171
  homepage: https://github.com/kaspernj/peak_flow_utils
@@ -195,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
187
  - !ruby/object:Gem::Version
196
188
  version: '0'
197
189
  requirements: []
198
- rubygems_version: 3.0.6
190
+ rubygems_version: 3.2.32
199
191
  signing_key:
200
192
  specification_version: 4
201
193
  summary: Utilities to be used with PeakFlow.
@@ -1,2 +0,0 @@
1
- //= link_directory ../javascripts/peak_flow_utils .js
2
- //= link_directory ../stylesheets/peak_flow_utils .css
@@ -1,14 +0,0 @@
1
- // This is a manifest file that'll be compiled into application.js, which will include all the files
2
- // listed below.
3
- //
4
- // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
- // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
- //
7
- // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
- // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
- //
10
- // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
- // about supported directives.
12
- //
13
- //= require activestorage
14
- //= require_tree .
@@ -1,15 +0,0 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
- * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
- * files in this directory. Styles in this file should be added after the last require_* statement.
11
- * It is generally better to create a new file per style scope.
12
- *
13
- *= require_tree .
14
- *= require_self
15
- */
@@ -1,10 +0,0 @@
1
- class PeakFlowUtils::Pings::SidekiqPingsController < PeakFlowUtils::ApplicationController
2
- def create
3
- sidekiq_queue = Sidekiq::Queue.new
4
-
5
- render json: {
6
- latency: sidekiq_queue.latency,
7
- queue_size: sidekiq_queue.size
8
- }
9
- end
10
- end
@@ -1,2 +0,0 @@
1
- module PeakFlowUtils::ApplicationHelper
2
- end
@@ -1,2 +0,0 @@
1
- class PeakFlowUtils::ApplicationJob < ActiveJob::Base
2
- end
@@ -1,4 +0,0 @@
1
- class PeakFlowUtils::ApplicationMailer < ActionMailer::Base
2
- default from: "from@example.com"
3
- layout "mailer"
4
- end
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Peak flow utils</title>
5
- <%= stylesheet_link_tag "peak_flow_utils/application", media: "all" %>
6
- <%= javascript_include_tag "peak_flow_utils/application" %>
7
- <%= csrf_meta_tags %>
8
- </head>
9
- <body>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>
@@ -1,21 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # This task detects and prints out the RSpec files for the current build group
4
-
5
- require "#{File.dirname(__FILE__)}/../lib/peak_flow_utils"
6
-
7
- args = {}
8
- ARGV.each do |arg|
9
- if (match = arg.match(/\A--(.+?)=(.+)\Z/))
10
- args[match[1]] = match[2]
11
- end
12
- end
13
-
14
- rspec_helper = PeakFlowUtils::RspecHelper.new(
15
- groups: args.fetch("groups").to_i,
16
- group_number: args.fetch("group-number").to_i,
17
- only_types: args["only-types"]&.split(","),
18
- tags: args["tags"]&.split(",")
19
- )
20
-
21
- print rspec_helper.group_files.map { |group_file| group_file.fetch(:path) }.join(" ")
@@ -1,195 +0,0 @@
1
- class PeakFlowUtils::RspecHelper
2
- attr_reader :only_types, :tags
3
-
4
- def initialize(groups:, group_number:, only_types: nil, tags: nil)
5
- @groups = groups
6
- @group_number = group_number
7
- @example_data_exists = File.exist?("spec/examples.txt")
8
- @only_types = only_types
9
- @tags = tags
10
- end
11
-
12
- def example_data_exists?
13
- @example_data_exists
14
- end
15
-
16
- def example_data
17
- @example_data ||= begin
18
- raw_data = File.read("spec/examples.txt")
19
-
20
- result = []
21
- raw_data.scan(/^\.\/(.+)\[(.+?)\]\s+\|\s+(.+?)\s+\|\s+((.+?) seconds|)\s+\|$/) do |match|
22
- file_path = match[0]
23
- spec_result = match[1]
24
- seconds = match[4]&.to_f
25
-
26
- spec_data = {
27
- file_path: file_path,
28
- spec_result: spec_result,
29
- seconds: seconds
30
- }
31
-
32
- result << spec_data
33
- end
34
-
35
- result
36
- end
37
- end
38
-
39
- def example_files
40
- @example_files ||= begin
41
- files = {}
42
- example_data.each do |spec_data|
43
- file_path = spec_data.fetch(:file_path)
44
- seconds = spec_data.fetch(:seconds)
45
-
46
- files[file_path] ||= {examples: 0, seconds: 0.0}
47
- files[file_path][:examples] += 1
48
- files[file_path][:seconds] += seconds if seconds
49
- end
50
-
51
- files
52
- end
53
- end
54
-
55
- def example_file(path)
56
- example_files[path]
57
- end
58
-
59
- def group_files
60
- return @group_files if @group_files
61
-
62
- sorted_files.each do |file|
63
- file_path = file.fetch(:path)
64
- file_data = example_file(file_path) if example_data_exists?
65
-
66
- if file_data
67
- examples = file_data.fetch(:examples)
68
- seconds = file_data.fetch(:seconds)
69
- else
70
- examples = file.fetch(:examples)
71
- end
72
-
73
- group = group_with_least
74
- group[:examples] += examples
75
- group[:files] << file
76
- group[:seconds] += seconds if seconds
77
- end
78
-
79
- @group_files = group_orders[@group_number - 1].fetch(:files)
80
- end
81
-
82
- def group_orders
83
- @group_orders ||= begin
84
- group_orders = []
85
- @groups.times do
86
- group_orders << {
87
- examples: 0,
88
- files: [],
89
- seconds: 0.0
90
- }
91
- end
92
- group_orders
93
- end
94
- end
95
-
96
- def group_with_least
97
- group_orders.min do |group1, group2|
98
- if example_data_exists? && group1.fetch(:seconds) != 0.0 && group2.fetch(:seconds) != 0.0
99
- group1.fetch(:seconds) <=> group2.fetch(:seconds)
100
- else
101
- group1.fetch(:examples) <=> group2.fetch(:examples)
102
- end
103
- end
104
- end
105
-
106
- # Sort them so that they are sorted by file path in three groups so each group have an equal amount of controller specs, features specs and so on
107
- def sorted_files
108
- files.values.sort do |file1, file2|
109
- file1_path = file1.fetch(:path)
110
- file2_path = file2.fetch(:path)
111
-
112
- file1_data = example_file(file1_path) if example_data_exists?
113
- file2_data = example_file(file2_path) if example_data_exists?
114
-
115
- if file1_data && file2_data && file1_data.fetch(:seconds) != 0.0 && file2_data.fetch(:seconds) != 0.0
116
- value1 = file1_data[:seconds]
117
- else
118
- value1 = file1.fetch(:points)
119
- end
120
-
121
- if file2_data && file1_data && file2_data.fetch(:seconds) != 0.0 && file2_data.fetch(:seconds) != 0.0
122
- value2 = file2_data[:seconds]
123
- else
124
- value2 = file2.fetch(:points)
125
- end
126
-
127
- if value1 == value2
128
- value2 = file1_path
129
- value1 = file2_path
130
- end
131
-
132
- value2 <=> value1
133
- end
134
- end
135
-
136
- private
137
-
138
- def dry_result_command
139
- command = "bundle exec rspec --dry-run --format json"
140
-
141
- tags&.each do |tag|
142
- command << " --tag #{tag}"
143
- end
144
-
145
- command
146
- end
147
-
148
- def dry_result
149
- require "json"
150
- @dry_result ||= ::JSON.parse(`#{dry_result_command}`)
151
- end
152
-
153
- def dry_file(path)
154
- files.fetch(path)
155
- end
156
-
157
- def files
158
- @files ||= begin
159
- result = {}
160
- dry_result.fetch("examples").each do |example|
161
- file_path = example.fetch("file_path")
162
- file_path = file_path[2, file_path.length]
163
- type = type_from_path(file_path)
164
- points = points_from_type(type)
165
-
166
- next if ignore_type?(type)
167
-
168
- result[file_path] = {examples: 0, path: file_path, points: 0, type: type} unless result.key?(file_path)
169
- result[file_path][:examples] += 1
170
- result[file_path][:points] += points
171
- end
172
-
173
- result
174
- end
175
- end
176
-
177
- def ignore_type?(type)
178
- only_types && !only_types.include?(type) # rubocop:disable Rails/NegateInclude:, Style/SafeNavigation
179
- end
180
-
181
- def type_from_path(file_path)
182
- match = file_path.match(/^spec\/(.+?)\//)
183
- match[1] if match
184
- end
185
-
186
- def points_from_type(type)
187
- if type == "feature" || type == "system"
188
- 10
189
- elsif type == "controllers"
190
- 3
191
- else
192
- 1
193
- end
194
- end
195
- end