peak_flow_utils 0.1.11 → 0.1.15

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.
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